(?=(.*\W.*){0,})
không phải là 0 ký tự không phải chữ và số. Đó là ít nhất 0 ký tự không phải chữ và số. Nếu bạn muốn mật khẩu không chứa bất kỳ ký tự không phải chữ số nào, bạn có thể thực hiện (?!.*\W)
hoặc (?=\w*$)
.
Một giải pháp đơn giản hơn là bỏ qua \W
nhìn về phía trước và sử dụng \w{8,}
thay vì .{8,}
.
Ngoài ra, \w
bao gồm \d
. Nếu bạn chỉ muốn alpha, bạn có thể thực hiện [^\W\d]
hoặc [A-Za-z]
.
/^(?=(?:.*?\d){2})(?=(?:.*?[A-Za-z]){2})\w{8,}$/
này sẽ xác nhận mật khẩu để chứa ít nhất hai chữ số , hai alpha, dài ít nhất 8 ký tự, và chứa nhân vật chỉ alpha-số (bao gồm cả gạch dưới).
\w
= [A-Za-z0-9_]
\d
= [0-9]
\s
= [ \t\n\r\f\v]
Edit: Để sử dụng trong tất cả các trình duyệt có thể bạn cần phải làm một cái gì đó như thế này:
var re = new RegExp("^(?=(?:.*?\\d){2})(?=(?:.*?[A-Za-z]){2})\\w{8,}$");
if (re.test(password)) { /* ok */ }
Chỉnh sửa2: Cập nhật gần đây trong câu hỏi gần như làm mất hiệu lực toàn bộ câu trả lời của tôi.^^;;
Bạn vẫn có thể sử dụng mã JavaScript cuối cùng, nếu bạn thay thế mẫu bằng những gì bạn đã có ban đầu.
Chỉnh sửa3: OK. Bây giờ tôi hiểu ý bạn là gì.
/^(?=.*[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
Có vẻ như (?=)
thực sự không có chiều rộng bằng 0 trong Internet Explorer.
http://development.thatoneplace.net/2008/05/bug-discovered-in-internet-explorer-7.html
Edit4: More đọc: http://blog.stevenlevithan.com/archives/regex-lookahead-bug
Tôi nghĩ rằng điều này có thể giải quyết vấn đề của bạn:
/^(?=.{8,}$)(?=(?:.*?\d){2})(?=(?:.*?[A-Za-z]){2})(?=(?:.*?\W){1})/
new RegExp("^(?=.{8,}$)(?=(?:.*?\\d){2})(?=(?:.*?[A-Za-z]){2})(?=(?:.*?\\W){1})")
Các (?=.{8,}$)
nhu cầu đến đầu tiên.
Yea Tôi thấy rằng ngay trước khi bạn đăng, thử nghiệm và nó hoạt động: D – nyxtom