Ответ 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,}$)
должен быть первым.