(?=(.*\W.*){0,})
不是 0 个非字母数字字符。这是至少 0非字母数字字符。如果您希望密码不包含任何非字母数字字符,您可以执行以下任一操作(?!.*\W)
or (?=\w*$)
.
一个更简单的解决方案是跳过\W
向前看,并使用\w{8,}
代替.{8,}
.
Also, \w
包括\d
。如果你只想要阿尔法,你可以这样做[^\W\d]
or [A-Za-z]
.
/^(?=(?:.*?\d){2})(?=(?:.*?[A-Za-z]){2})\w{8,}$/
这将验证密码至少包含两位数, 两个阿尔法, be 至少 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 代码。
Edit3:好的。现在我明白你的意思了。
/^(?=.*[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 http://development.thatoneplace.net/2008/05/bug-discovered-in-internet-explorer-7.html
Edit4:更多阅读:http://blog.stevenlevithan.com/archives/regex-lookahead-bug 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})")
The (?=.{8,}$)
需要先来。