RegEx, чтобы убедиться, что строка содержит хотя бы один символ нижнего регистра, символ верхнего регистра, цифру и символ - PullRequest
132 голосов
/ 13 октября 2009

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

  • строчные буквы
  • Прописные буквы
  • Цифра
  • Символ

Я знаю шаблоны для отдельных наборов, а именно [a-z], [A-Z], \d и _|[^\w] (я понял их правильно, не так ли?).

Но как мне объединить их, чтобы убедиться, что строка содержит все это в любом порядке?

Ответы [ 3 ]

305 голосов
/ 13 октября 2009

Если вам нужно одно регулярное выражение, попробуйте:

(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*\W)

Краткое объяснение:

(?=.*[a-z])        // use positive look ahead to see if at least one lower case letter exists
(?=.*[A-Z])        // use positive look ahead to see if at least one upper case letter exists
(?=.*\d)           // use positive look ahead to see if at least one digit exists
(?=.*\W])        // use positive look ahead to see if at least one non-word character exists

И я согласен с SilentGhost, \W может быть немного шире. Я бы заменил его набором символов следующим образом: [-+_!@#$%^&*.,?] (не стесняйтесь добавлять больше, конечно!)

13 голосов
/ 05 декабря 2017

Барт Киерс, у твоего регулярного выражения есть пара проблем. Лучший способ сделать это так:

(.*[a-z].*)       // For lower cases
(.*[A-Z].*)       // For upper cases
(.*\d.*)          // For digits

Таким образом, вы ищете независимо от того, в начале, в конце или в середине. У меня много проблем со сложными паролями.

5 голосов
/ 13 октября 2009

Вы можете сопоставить эти три группы по отдельности и убедиться, что все они присутствуют. Кроме того, [^\w] кажется слишком широким, но если вы этого хотите, вы можете заменить его на \W.

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