(?=(.*\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]
编辑:
要在所有浏览器中使用此功能,您可能需要执行以下操作:
var re = new RegExp("^(?=(?:.*?\\d){2})(?=(?:.*?[A-Za-z]){2})\\w{8,}$");
if (re.test(password)) { }
编辑2: 问题最近的更新几乎使我的整个答案失效了。 ^^;;
如果您将模式替换为最初的内容,则仍应能够在最终使用JavaScript代码。
编辑3: 好的,现在我知道你的意思了。
/^(?=.*[a-z].*[a-z])(?=.*[0-9].*[0-9]).{3,}/.test("password123")
/^(?=.*[a-z].*[a-z])(?=.*[0-9].*[0-9]).{4,}/.test("password123")
/^(?=.*[a-z].*[a-z]).{4,}/.test("password123")
在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,}$)
需要放在第一位。