Регулярное выражение для проверки надежности пароля
мои критерии надежности пароля, как показано ниже :
- длина 8 символов
- 2 буквы в верхнем регистре
- 1 Спецсимвол
(!@#$&*)
- 2 цифры
(0-9)
- 3 буквы в нижнем регистре
кто-нибудь может дать мне регулярное выражение для того же. Все условия должны быть выполнены паролем .
9 ответов:
вы можете сделать эти проверки с помощью положительных прогнозных утверждений:
^(?=.*[A-Z].*[A-Z])(?=.*[!@#$&*])(?=.*[0-9].*[0-9])(?=.*[a-z].*[a-z].*[a-z]).{8}$объяснение:
^ Start anchor (?=.*[A-Z].*[A-Z]) Ensure string has two uppercase letters. (?=.*[!@#$&*]) Ensure string has one special case letter. (?=.*[0-9].*[0-9]) Ensure string has two digits. (?=.*[a-z].*[a-z].*[a-z]) 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}С[A-Z]и\p{Ll}С[a-z].
ответы, приведенные выше, совершенны, но я предлагаю чтобы использовать несколько меньших регулярных выражений, а не большой.
Разбиение длинного регулярного выражения имеет некоторые преимущества:
- легкость писать и читать
- простота отладки
- простота добавления / удаления части регулярного выражения
обычно этот подход сохраняет код легко ремонтопригодны.
сказав это, я разделяю кусок кода, который я пишу в Свифт например:
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("[A-Z]", text: password).count > 0 if !hasUpperCase { return false } let hasLowerCase = RegExp.matchesForRegexInText("[a-z]", 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(.range)} } catch let error as NSError { print("invalid regex: \(error.localizedDescription)") return [] } } }
решение 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. (?=(?:[^A-Z]*[A-Z]){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)отрицаемые классы символов потребляют все до нужного символа за один шаг,требуя нулевого возврата. (Решение dot star работает просто отлично, но требует некоторого отступления.) Конечно, с короткими целевыми строками, такими как пароли, это повышение эффективности будет незначительным.
import re RegexLength=re.compile(r'^\S{8,}$') RegexDigit=re.compile(r'\d') RegexLower=re.compile(r'[a-z]') RegexUpper=re.compile(r'[A-Z]') def IsStrongPW(password): if RegexLength.search(password) == None or RegexDigit.search(password) == None or RegexUpper.search(password) == None or RegexLower.search(password) == None: return False else: return True while True: userpw=input("please input your passord to check: \n") if userpw == "exit": break else: print(IsStrongPW(userpw))
для PHP это работает отлично!
if(preg_match("/^(?=(?:[^A-Z]*[A-Z]){2})(?=(?:[^0-9]*[0-9]){2}).{8,}$/", 'CaSu4Li8')){ return true; }else{ return fasle; }в этом случае результат True
Thsks для @ridgerunner
другое решение:
import re passwordRegex = re.compile(r'''( ^(?=.*[A-Z].*[A-Z]) # at least two capital letters (?=.*[!@#$&*]) # at least one of these special c-er (?=.*[0-9].*[0-9]) # at least two numeric digits (?=.*[a-z].*[a-z].*[a-z]) # at least three lower case letters .{8,} # at least 8 total digits $ )''', re.VERBOSE) def userInputPasswordCheck(): print('Enter a potential password:') while True: m = input() mo = passwordRegex.search(m) if (not mo): print(''' Your password should have at least one special charachter, two digits, two uppercase and three lowercase charachter. Length: 8+ ch-ers. Enter another password:''') else: print('Password is strong') return userInputPasswordCheck()
пароль должен соответствовать по крайней мере 3 из следующих 4 Правил сложности,
[по крайней мере 1 заглавный символ (A-Z) по крайней мере 1 строчный символ (a-z) по крайней мере 1 цифра (0-9) по крайней мере 1 специальный символ - не забудьте рассматривать пространство как специальные символы тоже]
не менее 10 символов
не более 128 символов
не более 2 одинаковых символов в строке (например, 111 не допускается)
Comments