RegEx, чтобы убедиться, что строка содержит хотя бы один нижний регистр char, верхний регистр char, цифру и символ

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

  • Нижний регистр
  • Верхний символ
  • Digit
  • Символ

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

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

Ответ 1

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

(?=.*\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 может быть немного шире. Я бы заменил его набором символов следующим образом: [[email protected]#$%^&*.,?] (Не стесняйтесь добавлять больше, конечно!)

Ответ 2

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

Ответ 3

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

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

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