JavaScript在字符串中查找复杂正则表达式的第一个匹配项

时间:2016-05-11 06:26:48

标签: javascript regex

我正在尝试编写一个处理密码的脚本。我想在长字符串中找到正则表达式的第一个匹配项。例如,如果我有字符串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"]

我错过了什么?

1 个答案:

答案 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;