我有一个具有以下表达式的验证控件:
(?=(.*\\d.*){2,})(?=(.*\\w.*){2,})(?=(.*\\W.*){1,}).{8,}
密码至少包含 2 位数字、2 个字母字符、1 个非字母数字 和最少 8 个字符强>.不幸的是,这似乎不兼容跨浏览器。
此验证在 Firefox 中完美运行,但在 Internet Explorer 中则不然。
您的每个答案的组合导致:
var format = "^(?=.{" + minLength + ",})" +
(minAlpha > 0 ? "(?=(.*[A-Za-z].*){" + minAlpha + ",})" : "") +
(minNum > 0 ? "(?=(.*[0-9].*){" + minNum + ",})" : "") +
(minNonAlpha > 0 ? "(?=(.*\\W.*){" + minNonAlpha + ",})" : "") + ".*$";
EX: "^(?=.{x,})(?=(.*[A-Za-z].*){y,})(?=(.*[0-9].*){z,})(?=(.*\W.*){a,}).*$"
重要的是让 (?.{x,}) 的长度首先。
最佳答案
(?=(.*\W.*){0,})
不是 0 个非字母数字字符。它是至少 0 个非字母数字字符。如果您希望密码不包含任何非字母数字字符,您可以执行 (?!.*\W)
或 (?=\w*$)
。
一个更简单的解决方案是跳过 \W
前瞻,并使用 \w{8,}
而不是 。{8,}
.
此外,\w
包括 \d
。如果您只想要 alpha,您可以执行 [^\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)) { /* 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
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,}$)
需要放在第一位。
关于javascript - ASP.NET 正则表达式验证器(密码强度),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/198974/