我正在构建一个密码检查器 - 我现在有一个简单的要求,至少要有三个小写的非连续字母,要么我对正则表达式有很大的误解,要么别的。
我写了以下代码:
var password = 'mYpAsSwOrD',
r = new RegExp('[a-z]{3,}', 'g');
console.log(password.match(r)); // null
console.log(r.test(password)); // false
此外,需要'g'标志吗?量词不能有效地提供相同的功能吗?
比较好的是什么?将正则表达式与字符串匹配(第一个例子);或者对正则表达式测试字符串(第二个例子)?
答案 0 :(得分:2)
它只匹配至少包含3个小写字母的字符串。
> /^(?:[^a-z]*[a-z]){3}/.test("mYpAsSwOrD")
true
<强>解释强>
^
断言我们刚开始。(?..)
被称为非捕获组,它们不会捕获任何字符,但只会进行匹配操作。[^a-z]*
这将匹配任何字符零次或多次。[a-z]
这将匹配小写字母。(?:[^a-z]*[a-z]){3}
因此,如果整个非捕获组重复三次,它可以匹配至少三个小写字母的字符串。仅出于测试目的,我们无需进行完整匹配。或强>
你可以尝试下面的积极前瞻。
^(?=(?:[^a-z]*[a-z]){3})
<强>代码:强>
> /^(?=(?:[^a-z]*[a-z]){3})/.test("mYpAsSwOrD")
true
答案 1 :(得分:1)
答案 2 :(得分:0)
您的原始正则表达式匹配三个所需字符连续的位置。您可以将正则表达式更改为:
r = /[a-z](?:[^a-z]*[a-z]){2}/;
[a-z]
匹配小写字符。(?:[^a-z]*[a-z])
跳过所有非小写字符并尝试匹配小写字符。{2}
两次。至于你的另一个问题,g
标志不是必需的,因为它允许重复匹配,而对于你的用例,你只是匹配第一个集合并声明为返回true。