【问题标题】:Check password valid using regex in javascript在javascript中使用正则表达式检查密码是否有效
【发布时间】:2016-01-14 13:10:32
【问题描述】:
- 密码不得超过八个字符
- 密码必须至少包含 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。
谢谢!
【问题讨论】:
标签:
javascript
regex
passwords
【解决方案1】:
您需要使用$ 锚来检查长度(最好是从前瞻中移出该检查)并允许在它们之间插入一些非大写字母,如下所示:
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} 匹配除a-z 之外的 2 个符号序列零次或多次后跟 1 个小写字母。我以同样的方式修改了所有的前瞻。
【解决方案2】:
与只匹配两个大写字符的 [AZ]{2} 不同,您必须为两个单独范围之间的任何其他字符输入一个可选匹配项(您必须为小写字母、数字和符号)。所以你会改为把
[A-Z].*?[A-Z]
您实际上也不需要检查它是否至少有 8 个字符,因为任何满足小写/大写字母、数字和符号标准的密码无论如何都必须至少有 8 个字符。