Regex соответствует надежному паролю с двумя или более специальными символами - PullRequest
10 голосов
/ 12 января 2011

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

  • Не менее 15 символов
  • две или более строчных букв
  • две или более заглавных букв
  • две или более цифр
  • два или более из следующих специальных символов:! @ # $% ^ & * -

У меня есть регулярное выражение, которое заботится о большинстве случаев:

/^.*(?=.{15,})(?=.{2,}\d)(?=.{2,}[a-z])(?=.{2,}[A-Z])(?=.{2,}[\!\@\#\$\%\^\&\*\-]).*$/

Проблема здесь с символами, она работает с:

P@ssw0rdP@ssw0rd
Pssw0rdPssw0rd@@
Pssw0rd@@Pssw0rd

но не:

@@Pssw0rdPssw0rd

У меня есть генератор случайных паролей, настроенный для всестороннего тестирования, поэтому любые идеи очень ценятся. Спасибо!

Ответы [ 3 ]

15 голосов
/ 12 января 2011
/^(?=(?:.*[a-z]){2})(?=(?:.*[A-Z]){2})(?=(?:.*\d){2})(?=(?:.*[!@#$%^&*-]){2}).{15,}$/

Ваши взгляды ошибочны.Шаблон

(?=.{2,}[class])

означает совпадение 2 или более символов (независимо от того, какие символы), за которыми следует 1 символ требуемого класса.Это полностью отличается от указанного вами «2 или более символов нужного класса».

Чтобы правильно проверить, присутствует ли в тексте символ нужного класса, используйте

(?=.*[class])

и такВы хотите проверить это дважды, повторите шаблон

(?=.*[class].*[class])
# equivalent to (?=(?:.*[class]){2})
3 голосов
/ 12 января 2011

Я не уверен, что для этого теста достаточно одного регулярного выражения.

Лично я бы реализовал это примерно так: (трактовать как псевдокод, я не проверял)

function testPassword(pw) {
    var len = pw.length;
    if(len < 15) return false;
    if(pw.replace(/[a-z]/,'').length > len - 2) return false;
    if(pw.replace(/[A-Z]/,'').length > len - 2) return false;
    if(pw.replace(/[0-9]/,'').length > len - 2) return false;
    if(pw.replace(/[!@#$%^&*-]/,'').length > len - 2) return false;
    return true;
}
0 голосов
/ 12 января 2011

Уже есть несколько хороших объяснений, так что я просто коплюсь ...

/^
(?= .{15} )
(?= (?:.*[[:lower:]]){2} )
(?= (?:.*[[:upper:]]){2} )
(?= (?:.*[[:digit:]]){2} )
(?= (?:.*[!@#$%^&*-]){2} )
/x

...