Regex для пароля с повторяющимся шаблоном

У меня есть требование к паролю с приведенными ниже требованиями, все из которых выполнены, за исключением повторяющихся слов/шаблонов.

  • Хотя бы 1 цифра
  • Хотя бы 1 верхний регистр
  • Хотя бы 1 строчная буква
  • Минимум 1 специальный символ
  • Никаких повторяющихся символов (AA недействительно, 11 недействительно).
  • Нет повторяющихся слов или шаблонов (ProPersonPro или xyzxyz) – невозможно реализовать (в пределах одного регулярного выражения)

Это мое регулярное выражение, которое выполняет все требования, кроме последнего (повторяющегося шаблона).

(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[.,!@#$%^+=_])(?!.*(.)\1).{8,20}$

Есть ли способ решить эту проблему в рамках вышеприведенного регулярного выражения?

A8&x^3@UiA8&x^3@UiA8&x^3@Ui должно потерпеть неудачу. Это повторяющийся узор.
123 30.08.2024 05:38
...(?!.*(.{3,}).*\2)... ?
jhnc 30.08.2024 06:48

Вы нашли регулярное выражение, которое самостоятельно выполняет эту проверку?

Yunnosch 30.08.2024 07:45

Возможно вот так? ^(?=[^\d\s]*\d)(?=[^\sa-z]*[a-z])(?=[^\sA-Z]*[A-Z])(?=[^\s.,‌​!@#$%^+=_]*[.,!@#$%^‌​+=_])(?!.*(\S)\1)(?!‌​.*(\S{2,})\S*\2)\S{8‌​,20}$ См. regex101.com/r/BTEWBh/1

The fourth bird 30.08.2024 08:08
[a-z] - на дворе 2024 год, а пароли по-прежнему ограничены только ASCII? Благодаря этому их гораздо легче взломать.
AmigoJack 30.08.2024 10:05

Это требование настолько абсурдно, что создается впечатление, что это троллинг...

Hao Wu 30.08.2024 10:06

«Никаких повторяющихся слов и узоров»: чем отличается слово от узора? Есть ли у вас точное определение этих терминов в данном контексте? Если xyz такое слово, то является ли x таким же словом? Не означает ли это, что все персонажи должны быть уникальными?

trincot 30.08.2024 10:11

@Thefourthbird, твое регулярное выражение на высоте. Оно работает. Возможно, вы можете преобразовать его в ответ (предоставив несколько примеров строк).

programmerboy 30.08.2024 15:57
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
8
83
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Обновите шаблон регулярного выражения, состоящий из повторяющихся букв (\w) или цифр (\d), следующим образом:

/(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[.,!@#$%^+=_])(?!.*(.)\1)(?![\w\d]\1).{8,20}$/gm

https://regex101.com/r/uMQyZA/1

Спасибо, но он не соответствует требованиям к повторяющимся словам/шаблонам, если выполняются другие требования. Например, если ProPersonPro заканчивается на 1! тогда оно примет это. См. комментарий @TheFourthBird выше.

programmerboy 30.08.2024 16:10

Я обновил шаблон регулярного выражения. Пожалуйста, проверьте один раз @programmerboy

Art Bindu 30.08.2024 17:49

Все еще не работает так, как ожидалось. В приведенной выше ссылке на регулярное выражение можно найти повторяющиеся шаблоны, такие как ProPersonPro1@ и xyzxyz@1ABC RegEx, предоставленные @Thefourthbird, работает!

programmerboy 30.08.2024 22:37
Ответ принят как подходящий

Предполагая, что ваш пароль не должен содержать пробелов, вы можете использовать \S для соответствия символам без пробелов вместо точки.

^(?=[^\d\s]*\d)(?=[^\sa-z]*[a-z])(?=[^\sA-Z]*[A-Z])(?=[^\s.,!@#$%^+=_]*[.,!@#$%^+=_])(?!\S*(\S)\1)(?!\S*(\S{2})\S*\2)\S{8,20}$

Узор соответствует:

  • ^ Начало строки
  • (?=[^\d\s]*\d) Укажите цифру справа, используя отрицательный класс символов, чтобы соответствовать необязательным символам без пробелов, исключая сначала цифру.
  • (?=[^\sa-z]*[a-z]) Тот же механизм для символов a-z.
  • (?=[^\sA-Z]*[A-Z]) То же самое для персонажа от А до Я.
  • (?=[^\s.,!@#$%^+=_]*[.,!@#$%^+=_]) А также для персонажа, которого вы считаете особенным
  • (?!\S*(\S)\1) Утвердить, что справа нет двух последовательных одинаковых символов без пробелов.
  • (?!\S*(\S{2})\S*\2) Утвердить, что справа нет последовательности из двух одинаковых символов без пробелов (разделенных между ними необязательными символами без пробелов).
  • \S{8,20}
  • $ Конец строки

Посмотрите демонстрацию регулярных выражений

Другие вопросы по теме