在 javascript 中使用正则表达式检查密码有效性
2016-01-14
915
- 密码必须为八个字符或更长
- 密码必须至少包含 2 个小写字母。
- 密码必须至少包含 2 个大写字母。
- 密码必须至少包含 2 个数字字符。
- 密码必须至少包含 2 个特殊字符。
我的代码
function checkPass(pw) {
var regx = new RegExp("^(?=.*[a-z]{2})(?=.*[A-Z]{2})(?=.*[0-9]{2})(?=.*[!@#\$%\^&\*\)\(]{2})(?=.{8,})");
return regx.test(pw);
>
checkPass('PAssword12#$') => true
checkPass('PaSsword12#$') => false
我希望当 2 个大写字符不连续时函数返回 true。
谢谢!
2个回答
您需要使用
$
锚点来检查长度(最好将该检查从前瞻中移出),并允许在中间插入一些非大写字母,如下所示:
function checkPass(pw) {
var regx = /^(?=(?:[^a-z]*[a-z]){2})(?=(?:[^A-Z]*[A-Z]){2})(?=(?:\D*\d){2})(?=(?:[^!@#$%^&*)(]*[!@#$%^&*)(]){2}).{8,}$/;
return regx.test(pw);
}
document.write(checkPass('PAssword12#$') + "<br>");
document.write(checkPass('PaSsword12#$'));
请注意,我使用了对比原则:
(?:[^a-z]*[a-z]){2
匹配 2 个除
a-z
之外的符号序列零次或多次,后跟 1 个小写字母。我以相同的方式修改了所有前瞻。
Wiktor Stribiżew
2016-01-14
与仅匹配两个大写字母的 [A-Z]{2} 不同,您必须输入可选匹配,以匹配两个不同范围之间的任何其他字符(您还必须对小写字母、数字和符号执行此操作)。因此,您应输入
[A-Z].*?[A-Z]
您实际上也不需要检查它是否至少有 8 个字符,因为任何符合小写/大写字母、数字和符号标准的密码都必须至少有 8 个字符。
John Clifford
2016-01-14