Intereting Posts
WordPress: Загрузить изображение на странице «Параметры администратора» Ошибки php parse не будут отображаться Инструмент ретроспективного автоматического комментария / phpDocumentor Netbeans-esque (для Eclipse или автономного) Предупреждение: Отсутствует аргумент 2 для wpdb :: prepare (), Как легко минимизировать JS в PHP … Или что-то еще Zend Instance теряется в случайные моменты Композитор использует Github перед упаковщиком Как отображать данные из базы данных Массивы из нескольких форм загрузки, Загрузка изображений, а затем вставка в базу данных (PHP, MySQL) Как заставить Doctrine обновить поля типа массива? Создание уникального номера заказа Ошибка выполнения PHP Php: Предупреждение: заголовок может содержать не более одного заголовка, а новая строка обнаружена в Как узнать, открыты ли магазины или закрыты – работа с часами? Правильный способ обновления двунаправленного отношения Many to Many symfony2-doctrine

Regex для проверки надежности пароля.

Мои критерии прочности пароля следующие:

  • Длина 8 символов
  • 2 буквы в верхнем случае
  • 1 Специальный символ (!@#$&*)
  • 2 цифры (0-9)
  • 3 буквы в нижнем корпусе

Может кто-нибудь, пожалуйста, дайте мне регулярное выражение для этого. Все условия должны быть выполнены с помощью пароля.

Вы можете выполнить эти проверки, используя положительные ожидания вперед:

 ^(?=.*[AZ].*[AZ])(?=.*[!@#$&*])(?=.*[0-9].*[0-9])(?=.*[az].*[az].*[az]).{8}$ 

Рублевая ссылка

Объяснение:

 ^ Start anchor (?=.*[AZ].*[AZ]) Ensure string has two uppercase letters. (?=.*[!@#$&*]) Ensure string has one special case letter. (?=.*[0-9].*[0-9]) Ensure string has two digits. (?=.*[az].*[az].*[az]) Ensure string has three lowercase letters. .{8} Ensure string is of length 8. $ End anchor. 

Вы можете использовать позитивный внешний вид с нулевой длиной, чтобы указать каждое из ваших ограничений отдельно:

 (?=.{8,})(?=.*\p{Lu}.*\p{Lu})(?=.*[!@#$&*])(?=.*[0-9])(?=.*\p{Ll}.*\p{Ll}) 

Если ваш механизм регулярных выражений не поддерживает нотацию \p и чистый ASCII достаточно, вы можете заменить \p{Lu} на [AZ] и \p{Ll} на [az] .

Ответы, приведенные выше, являются совершенными, но я предлагаю использовать несколько меньших регулярных выражений, а не большой.
Разделение длинного регулярного выражения имеет ряд преимуществ:

  • легкость писать и читать
  • легкость отладки
  • легкость добавления / удаления части регулярного выражения

Как правило, этот подход позволяет легко поддерживать код.

Сказав это, я разделяю фрагмент кода, который я пишу в Swift как пример:

 struct RegExp { /** Check password complexity - parameter password: password to test - parameter length: password min length - parameter patternsToEscape: patterns that password must not contains - parameter caseSensitivty: specify if password must conforms case sensitivity or not - parameter numericDigits: specify if password must conforms contains numeric digits or not - returns: boolean that describes if password is valid or not */ static func checkPasswordComplexity(password password: String, length: Int, patternsToEscape: [String], caseSensitivty: Bool, numericDigits: Bool) -> Bool { if (password.length < length) { return false } if caseSensitivty { let hasUpperCase = RegExp.matchesForRegexInText("[AZ]", text: password).count > 0 if !hasUpperCase { return false } let hasLowerCase = RegExp.matchesForRegexInText("[az]", text: password).count > 0 if !hasLowerCase { return false } } if numericDigits { let hasNumbers = RegExp.matchesForRegexInText("\\d", text: password).count > 0 if !hasNumbers { return false } } if patternsToEscape.count > 0 { let passwordLowerCase = password.lowercaseString for pattern in patternsToEscape { let hasMatchesWithPattern = RegExp.matchesForRegexInText(pattern, text: passwordLowerCase).count > 0 if hasMatchesWithPattern { return false } } } return true } static func matchesForRegexInText(regex: String, text: String) -> [String] { do { let regex = try NSRegularExpression(pattern: regex, options: []) let nsString = text as NSString let results = regex.matchesInString(text, options: [], range: NSMakeRange(0, nsString.length)) return results.map { nsString.substringWithRange($0.range)} } catch let error as NSError { print("invalid regex: \(error.localizedDescription)") return [] } } } 

Я бы предложил добавить

 (?!.*pass|.*word|.*1234|.*qwer|.*asdf) exclude common passwords 

Решение codaddict работает отлично, но этот бит немного эффективнее: (синтаксис Python)

 password = re.compile(r"""(?#!py password Rev:20160831_2100) # Validate password: 2 upper, 1 special, 2 digit, 1 lower, 8 chars. ^ # Anchor to start of string. (?=(?:[^AZ]*[AZ]){2}) # At least two uppercase. (?=[^!@#$&*]*[!@#$&*]) # At least one "special". (?=(?:[^0-9]*[0-9]){2}) # At least two digit. .{8,} # Password length is 8 or more. $ # Anchor to end of string. """, re.VERBOSE) 

Отрицательные классы символов потребляют все до желаемого символа за один шаг, требуя нулевого обратного отсчета. (Решение с точечной звездой работает просто отлично, но требует некоторого возврата.) Конечно, с короткими целевыми строками, такими как пароли, это повышение эффективности будет незначительным.