2016-09-12 1 views
-1

Я пытаюсь сделать регулярное выражение для разрешения только сильных паролей, сильных в этом случае определяется как:RegEx - Password Strength

  • должен начинаться с буквой (на верхнем или нижний регистр)
  • Должно быть, по крайней мере, 8 и до 12 символов
  • должны иметь по крайней мере одну заглавную букву
  • Должно быть, по крайней мере, три прописные буквы
  • должны иметь по крайней мере два Номера
  • Должно быть, по крайней мере, два специальных символа
  • Максимальное количество одинаковых последовательных символов три

Теперь, последний дает мне неприятности. Как считать последовательные символы?

Например, FOOfoo!?123 должен работать, но FOOOfoo!?12 не должен (потому что или три эссе).

То, что я получил до сих пор:

^[A-Za-z]{1}(?=.*[A-Z]{1,})(?=.*[a-z]{3,})(?=.*[0-9]{2,})(?=.*[[email protected]*#&$]{2,}).{8,12}$ 

И еще одно: что-то неладно, потому что мое регулярное выражение выше утверждает, что строки, как FooFoo!?123 являются недействительными. Я думаю это потому, что он только проверяет одну или несколько заглавных букв или три или более прописных букв или номера или скидки, но я не хочу этого, я хочу, чтобы это пароль содержит три прописные буквы всего, он должен быть действительным. Как мне это сделать?

+6

Просьба сообщить, что вы фактически не применяете вышеуказанные ужасные правила для пользователей, и это всего лишь руководство по силе. – PeeHaa

+0

Последние, но три условия выполняются в регулярном выражении, как если бы они были * Должно иметь по крайней мере три/два ... символа ** на растяжке ***. Это то, что вы намеревались сопоставить? –

+1

'Должен иметь как минимум два номера. Если я правильно понимаю ваше выражение, выражение будет соответствовать *, только если * числа являются последовательными. – npinti

ответ

1

Когда у вас так много условий, может быть хорошей идеей - если ваша среда позволяет это - разделить регулярное выражение и проверить каждое условие отдельно.

Если вы не можете сделать это, вот версия свободного разнос фиксированного регулярное выражение:

^         # start of string 
(?=[^A-Z]*[A-Z])     # At least 1 uppercase ASCII letter 
(?=(?:[^a-z]*[a-z]){3})   # at least 3 lowercase ASCII letters 
(?=(?:[^0-9]*[0-9]){‌​2})   # at least 2 ASCII digits 
(?=(?:[^[email protected]*#&$]*‌​[[email protected]*#&$]){2}) # at least 2 special symbols 
(?!.*(‌​.)\1{2})     # No 3 consecutive characters 
[A-Za-z]       # An ASCII letter 
.{7,‌​11}       # 7 to 11 any characters but newline 
$         # end of string 

В однострочника:

^(?=[^A-Z]*[A-Z])(?=(?:[^a-z]*[a-z]){3})(?=(?:[^0-9]*[0-9]){2})(?=(?:[^[email protected]*#&$]*[[email protected]*#&$]){2})(?!.*(.)\1{2})[A-Za-z].{7,11}$ 

ВИДЕТЬ regex demo

Примечания :

  • Должен иметь как минимум три строчных буквы, и аналогичные условия выполняются с использованием принципа контраста, то есть до [a-z], у нас может быть 0+ противоположных символов, соответствующих [^a-z].
  • Чтобы соответствовать 3-х букв глобально, не последовательно, мы должны использовать предельный квантор на группировках, а не от класса персонажа, таким образом, [a-z]{3,} (= последовательных 3 или более строчных букв) превращаются в (?:[^a-z]*[a-z]){3} (= 3 последовательности букв без строчной буквы, сопровождаемых 1 строчной буквой).
  • условия вам нужно это (?!.*(‌​.)\1{2}) - отрицательный предпросмотр ((?!...)), который проверяет наличие любого характера захваченного с (.), который повторяется дважды после него с \1 и обратной ссылкой {2} ограничивающего квантором, установленного на обратной ссылке. И .* означает, что повторяющиеся символы могут появляться в любом месте строки.