Надежная проверка пароля - PullRequest
1 голос
/ 10 марта 2020

Мне нужно регулярное выражение, которое проверяет, являются ли пароли:

  • по крайней мере 8 символов
  • содержат по крайней мере 1 заглавные буквы буква
  • содержит не менее 1 строчные буквы буква
  • содержит не менее 1 число или не менее 1 специальный символ
  • сделать не повторить символ более 2 раз подряд

Примеры, которые должны совпадать:

  • Test1234!
  • Te123stE

Примеры, которые не должны совпадать:

  • Teeest123! *
  • ! TESTT1234

Это то, что я пробовал до сих пор:

^(?!.*pass|.*Pass|.*qwer|.*Qwer)(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9#?!@$%^&*-]).{8,}$

Я не знаю, как сопоставить повторяющиеся символы. Есть идеи?

Ответы [ 2 ]

3 голосов
/ 11 марта 2020

Если вы хотите потерпеть неудачу в совпадении, если есть 3 или более последовательных идентичных символа, используйте (?!.*(.)\1{2}) lookahead:

^(?=[^A-Z]*[A-Z])(?=[^a-z]*[a-z])(?=[^0-9#?!@$%^&*-]*[0-9#?!@$%^&*-])(?!.*[pP]ass|.*[qQ]wer)(?!.*(.)\1{2}).{8,}$

См. regex demo * 1008 • 1017 * это регулярное выражение demo

ПРИМЕЧАНИЕ Изменения: наиболее эффективные прогнозные данные перемещаются в начало (сразу после ^), а наименее эффективные перемещаются вправо.

Наиболее распространенные взгляды, которые проверяют строчные, прописные буквы и специальные / ди git символы, улучшаются в соответствии с принципом контрастности .

Детали шаблона

  • ^ - начало строки
  • (?=[^A-Z]*[A-Z]) - должна быть хотя бы одна прописная буква ASCII
  • (?=[^a-z]*[a-z]) - должна быть хотя бы одна строчная буква ASCII
  • (?=[^0-9#?!@$%^&*-]*[0-9#?!@$%^&*-]) - должна быть хотя бы одна специальная буква ar из набора 0-9#?!@$%^&*- (di git или #, ?, !, @, $, %, ^, &, *, -)
  • (?!.*[pP]ass|.*[qQ]wer) - нет pass / Pass и qwer / Qwer в разрешенной строке
  • (?!.*(.).*\1.*\1) - нет трех не обязательно последовательных повторяющихся символов разрешено
  • .{8,} - восемь или более символов, кроме символов разрыва строки
  • $ - конец строки.
1 голос
/ 11 марта 2020

Вы можете использовать следующее регулярное выражение:

/
(?=.*[0-9#?!@$%^&*-])       # 1+ digit or special char
(?=.*[A-Z])                 # 1+ uc letters
(?=.*[a-z])                 # 1+ lc letters
(?=[a-zA-Z0-9#?!@$%^&*-]*$) # all chars valid
(?!.*(.)\1{2})              # no 3+ repeats
.{8,}                       # match string if length >= 8
/x                          # free-spacing mode

Демо

...