我正在尝试编写一个处理密码的脚本。我想在长字符串中找到正则表达式的第一个匹配项。例如,如果我有字符串testingtestingPassWord12#$testingtesting
并且我想找到具有2个大写,2个小写,2个数字,2个特殊字符和最小长度12的第一个实例,则它应该返回PassWord12#$
。如果我想要相同的标准,但长度为16,则应返回tingPassWord12#$
。
这就是我对正则表达式的看法:(?=.*[A-Z].*[A-Z])(?=.*[!@#$&*])(?=.*[0-9].*[0-9])(?=.*[a-z].*[a-z].*[a-z]).{12}
该正则表达式基于此SO:Regex to validate password strength
我尝试了以下操作,但它只返回字符串中的前12个字符而不是匹配的字符串:
var str = 'testingtestingPassWord12#$testingtesting',
re = /(?=.*[A-Z].*[A-Z])(?=.*[!@#$&*])(?=.*[0-9].*[0-9])(?=.*[a-z].*[a-z].*[a-z]).{12}/;
console.log(str.match(re));
// Output: ["testingtestingPa"]
我错过了什么?
答案 0 :(得分:0)
使用简单的for
循环解决方案。
基本上它遍历所需长度的每个子字符串,并检查它是否与密码条件匹配:
var str = 'testingtestingPassWord12#$testingtesting',
re = /(?=(?:.*[A-Z]){2})(?=(?:.*[!@#$&*]){2})(?=(?:.*[0-9]){2})(?=(?:.*[a-z]){2}).{12,}/;
var substring, res = '';
var passwordLength = 12;
for (var i = 0; i < str.length - passwordLength; i++) {
substring = str.substr(i, passwordLength);
if(substring.match(re)) {
res = substring.match(re);
break;
}
}
document.body.textContent = res;