Как я могу написать регулярное выражение, которое соответствует двум или более символам в любом порядке? - PullRequest
0 голосов
/ 26 декабря 2018

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

  • Всего не менее 8 символов.
  • Не больше 21.
  • Должно содержать не менее двух заглавных букв
  • Должно содержать не менее двух строчных букв
  • Должно содержать не менее двух чисел
  • Должно содержать по крайней мере два из этих символов! @ # $% ^ & * ()
  • Все символы могут быть в любой перестановке, необязательно повторяться в последовательности.
  • (добавлено с правкой) Не может содержать любой другой символ, не указанный выше.

Я думаю, что это регулярное выражение близко, но не работает правильно.

/^(?=(?:\D*\d){2,}\D*$)(?=(?:[^a-z]*[a-z]){2,}[^a-z]*$)(?=(?:[^A-Z]*[A-Z]){2,}[^A-Z]*$)(?=(?:[^!@#$%^&*]*[!@#$%^&*]){2,}[^!@#$%^&*]*$)[a-zA-Z0-9!@#$%^&*]{8,21}$/

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

Я выйду из рук вон и думаю, что вас попросили "создать регулярное выражение, которое проверит пароль приложения".

1) Читать Правила паролей - чушь собачья .Посмотрите, сможете ли вы убедить своего лидера, команду или клиента изменить эти правила (брутто).В частности, увеличьте максимальную длину как минимум до 32 и отбросьте другие правила.

2) Я уже знаю, что вы, вероятно, не можете этого сделать, поэтому по крайней мере сделайте так, чтобы вашприложение может четко объяснить , какое правило пароля было нарушено.Сделайте каждое правило отдельной проверкой, которую вы выполняете (как предложил Ланселод), по порядку, с четким сообщением о сбое для каждого пользователя.

3) Если вы можете сделать это, вам может даже не понадобиться регулярное выражение для этогоконкретное правило - иногда классическое сканирование строк проще и обычно намного быстрее.

0 голосов
/ 26 декабря 2018

Используйте lookaheads с правильным синтаксисом:

^(?=.*[A-Z].*[A-Z])(?=.*[a-z].*[a-z])(?=.*[0-9].*[0-9])(?=.*[!@#$%^&*()].*[!@#$%^&*()])[a-zA-Z0-9!@#$%^&*]{8,21}$

В качестве примера того, что вы делали:

(?=(?:[^a-z]*[a-z]){2,}[^a-z]*$)

Это говорит о совпадении с start изпароль любое число не строчные, за которыми следуют строчные буквы, тот же прогноз дважды .Имейте в виду, что предпросмотры утверждают, но не совпадают или не перемещаются, поэтому вы просто проверяли одну строчную букву дважды.Чтобы проверить наличие как минимум двух строчных букв, используйте:

(?=.*[a-z].*[a-z])

Эта команда проверяет наличие двух строчных букв в любом месте пароля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...