为什么这个简单的JavaScript密码正则表达式不起作用?

时间:2014-10-06 11:14:35

标签: javascript regex

我正在构建一个密码检查器 - 我现在有一个简单的要求,至少要有三个小写的非连续字母,要么我对正则表达式有很大的误解,要么别的。

我写了以下代码:

var password = 'mYpAsSwOrD',
    r = new RegExp('[a-z]{3,}', 'g');

console.log(password.match(r)); // null
console.log(r.test(password)); // false

此外,需要'g'标志吗?量词不能有效地提供相同的功能吗?

比较好的是什么?将正则表达式与字符串匹配(第一个例子);或者对正则表达式测试字符串(第二个例子)?

3 个答案:

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

(?=(.*?[a-z]){3}).*

你可以尝试一下。参见演示。

http://regex101.com/r/hQ1rP0/24

答案 2 :(得分:0)

您的原始正则表达式匹配三个所需字符连续的位置。您可以将正则表达式更改为:

r = /[a-z](?:[^a-z]*[a-z]){2}/;
  • [a-z]匹配小写字符。
  • (?:[^a-z]*[a-z])跳过所有非小写字符并尝试匹配小写字符。
    • {2}两次。

至于你的另一个问题,g标志不是必需的,因为它允许重复匹配,而对于你的用例,你只是匹配第一个集合并声明为返回true。