(?=(.*\W.*){0,})
jest nie 0 nie alfanumeryczne znaki. Jest to co najmniej 0 niealfanumerycznych znaków. Jeśli chcesz, aby hasło nie zawierało żadnych niealfanumerycznych znaków, możesz to zrobić: (?!.*\W)
lub (?=\w*$)
.
Prostszym rozwiązaniem byłoby pominięcie wyświetlania \W
i użycie \w{8,}
zamiast .{8,}
.
Również \w
zawiera \d
. Jeśli chcesz tylko alfa, możesz to zrobić: [^\W\d]
lub [A-Za-z]
.
/^(?=(?:.*?\d){2})(?=(?:.*?[A-Za-z]){2})\w{8,}$/
To sprawdzania hasła zawierać co najmniej dwie cyfry , dwie wartości alfa być przynajmniej osiem znaków i zawierają tylko znaki alfanumeryczne (w tym podkreślenie).
\w
= [A-Za-z0-9_]
\d
= [0-9]
\s
= [ \t\n\r\f\v]
Edit: W tym celu używać we wszystkich przeglądarkach prawdopodobnie trzeba zrobić coś takiego:
var re = new RegExp("^(?=(?:.*?\\d){2})(?=(?:.*?[A-Za-z]){2})\\w{8,}$");
if (re.test(password)) { /* ok */ }
Edycja2: Niedawna aktualizacja pytania niemal unieważnia moją całą odpowiedź.^^;;
Nadal powinieneś być w stanie używać kodu JavaScript na końcu, jeśli zamienisz wzór na oryginalny.
Edytuj3: OK. Teraz rozumiem, co masz na myśli.
/^(?=.*[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
Wydaje (?=)
naprawdę nie jest zero-szerokość w programie Internet Explorer.
http://development.thatoneplace.net/2008/05/bug-discovered-in-internet-explorer-7.html
Edit4: Więcej czytanie: http://blog.stevenlevithan.com/archives/regex-lookahead-bug
myślę, że można to rozwiązać swój problem:
/^(?=.{8,}$)(?=(?:.*?\d){2})(?=(?:.*?[A-Za-z]){2})(?=(?:.*?\W){1})/
new RegExp("^(?=.{8,}$)(?=(?:.*?\\d){2})(?=(?:.*?[A-Za-z]){2})(?=(?:.*?\\W){1})")
W (?=.{8,}$)
potrzeby na pierwszym miejscu.
Tak, widziałem to tuż przed wysłaniem, przetestowaniem i działaniem: D – nyxtom