Регулятор регулярного выражения ASP.NET(сила пароля)

У меня есть элемент проверки, который имеет следующее выражение:

(?=(.*\\d.*){2,})(?=(.*\\w.*){2,})(?=(.*\\W.*){1,}).{8,}

Это пароль с не менее 2 цифрами, 2 альфа-символами, 1 не-буквенно-числовой и минимум 8 символов. К сожалению, это не похоже на кросс-браузер.

Эта проверка отлично работает в Firefox, но не в Internet Explorer.

Комбинация каждого из ваших ответов приводит к:

var format = "^(?=.{" + minLength + ",})" + 
    (minAlpha > 0 ? "(?=(.*[A-Za-z].*){" + minAlpha + ",})" : "") + 
    (minNum > 0 ? "(?=(.*[0-9].*){" + minNum + ",})" : "") + 
    (minNonAlpha > 0 ? "(?=(.*\\W.*){" + minNonAlpha + ",})" : "") + ".*$";

EX: "^(?=.{x,})(?=(.*[A-Za-z].*){y,})(?=(.*[0-9].*){z,})(?=(.*\W.*){a,}).*$"

Важная часть имеет (?. {x,}) для длины сначала.

Ответ 1

(?=(.*\W.*){0,}) не является 0 не буквенно-цифровыми символами. Это не менее 0 не буквенно-цифровых символов. Если вы хотите, чтобы пароль не содержал никаких буквенно-цифровых символов, вы могли бы сделать либо (?!.*\W), либо (?=\w*$).

Более простым решением было бы пропустить \W look-ahead и использовать \w{8,} вместо .{8,}.

Кроме того, \W включает \d. Если вам нужна только альфа, вы можете сделать либо [^\W\d], либо [A-Za-z].

/^(?=(?:.*?\d){2})(?=(?:.*?[A-Za-z]){2})\w{8,}$/

Это подтвердит пароль, чтобы содержать как минимум две цифры, два альфа, не менее 8 символов и содержать только буквенно-цифровые символы (включая подчеркивание).

  • \W= [A-Za-z0-9_]
  • \d= [0-9]
  • \s= [ \t\n\r\f\v]

Edit: Чтобы использовать это во всех браузерах, вам, вероятно, нужно сделать что-то вроде этого:

var re = new RegExp("^(?=(?:.*?\\d){2})(?=(?:.*?[A-Za-z]){2})\\w{8,}$");
if (re.test(password)) { /* ok */ }

Edit2: Недавнее обновление в вопросе почти недействительно для моего всего ответа. ^^;;

Вы все равно сможете использовать код JavaScript в конце, если вы замените шаблон на то, что вы изначально.

Правка3: ОК. Теперь я понимаю, что вы имеете в виду.

/^(?=.*[a-z].*[a-z])(?=.*[0-9].*[0-9]).{3,}/.test("password123") // matches
/^(?=.*[a-z].*[a-z])(?=.*[0-9].*[0-9]).{4,}/.test("password123") // does not match
/^(?=.*[a-z].*[a-z]).{4,}/.test("password123")                   // matches

Кажется, что (?= ) на самом деле не имеет нулевой ширины в Internet Explorer.

http://development.thatoneplace.net/2008/05/bug-discovered-in-internet-explorer-7.html

Edit4: Дополнительная информация: http://blog.stevenlevithan.com/archives/regex-lookahead-bug

Я думаю, что это может решить вашу проблему:

/^(?=.{8,}$)(?=(?:.*?\d){2})(?=(?:.*?[A-Za-z]){2})(?=(?:.*?\W){1})/
new RegExp("^(?=.{8,}$)(?=(?:.*?\\d){2})(?=(?:.*?[A-Za-z]){2})(?=(?:.*?\\W){1})")

(?=.{8,}$) должен быть первым.

Ответ 2

Это даст вам 2-минутные цифры, 2-минутные символы и длину не менее 8 символов... Я отказываюсь показать вам, как не разрешать пользователям иметь не-буквенно-цифровые символы в своих паролях, почему сайты хотят обеспечить меньшую нагрузку безопасные пароли?

^(?=.*\d{2})(?=.*[a-zA-Z]{2}).{8,}$