我是一个正则表达式的新手,到目前为止只用它来做简单的事情,比如"必须是数字或字母".现在我必须做一些更复杂的事情.
我需要使用它来验证密码,密码必须是8-16个字符,没有控制/非打印/非ASCII字符,并且必须至少具有以下三个:
我在想我要做的就是写一些诸如"一个大写字母,小写字母和数字,或一个大写字母,小写字母和一个符号,或一个大写字母,一个数字或一个符号,或...... "涵盖所有可能的"4个中的3个"组合,但这似乎过多了.有更简单的解决方案吗?
正确的方法是分别检查所有五个条件.但是,我认为你有一个理由想要一个正则表达式,在这里你去:
/^((?=.*[A-Z])(?=.*[a-z])(?=.*\d)|(?=.*[a-z])(?=.*\d)(?=.*[\$\%\&])|(?=.*[A-Z])(?=.*\d)(?=.*[\$\%\&])|(?=.*[A-Z])(?=.*[a-z])(?=.*[\$\%\&])).{8,16}$/
Run Code Online (Sandbox Code Playgroud)
说明:
^$.{n,m}匹配n和m字符(在我们的例子中为8和16).(?=.*X),X你想要检查的东西.例如,如果要确保字符串包含小写字母,则可以执行此操作(?=.*[a-z]).X,Y并且Z实际上没有匹配它们,可以通过附加三个前瞻来使用上一个配方(?=.*X)(?=.*Y)(?=.*Z)|(或) - cCD|cDS|CDS|CcS(c=小写字母,C=大写字母,D=数字,S=特殊)最好的方法是分别检查每个条件.如果您尝试将所有条件标准放入一个表达式中,性能将受到影响(请参阅接受的答案).我还强烈建议不要将密码的长度限制为16个字符 - 这对于现代标准来说是极不安全的.尝试更多像64个字符,甚至更好的东西,128 - 假设您的哈希体系结构可以处理负载.
您也没有指定语言,但这是在JavaScript中执行此操作的一种方法:
var pws = [
"%5abCdefg",
"&5ab",
"%5abCdef",
"5Bcdwefg",
"BCADLKJSDSDFlk"
];
function pwCheck(pw) {
var criteria = 0;
if (pw.toUpperCase() != pw) {
// has lower case letters
criteria++;
}
if (pw.toLowerCase() != pw) {
// has upper case letters
criteria++;
}
if (/^[a-zA-Z0-9]*$/.test(pw) === false) {
// has special characters
criteria++;
}
if (/\d/.test(pw) === true) {
// has numbers
criteria++;
}
// returns true if 3 or more criteria was met and length is appropriate
return (criteria >= 3 && pw.length >= 8 && pw.length <= 16);
}
pws.forEach(function(pw) {
console.log(pw + ": " + pwCheck(pw).toString());
});
Run Code Online (Sandbox Code Playgroud)