(?=(.*\W.*){0,})
- это не 0 не алфавитно-цифровых символов. Это не менее 0 не буквенно-цифровых символов. Если вы хотите, чтобы пароль не содержал никаких буквенно-цифровых символов, вы можете ввести (?!.*\W)
или (?=\w*$)
.
Более простым решением было бы пропустить прогноз \W
и использовать \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: More reading: 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,}$)
должен стоять первым.