繁体   English   中英

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

[英]Why does this simple JavaScript password regex not work?

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

我写了以下代码:

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

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

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

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

它仅匹配具有至少3个小写字母的字符串。

> /^(?:[^a-z]*[a-z]){3}/.test("mYpAsSwOrD")
true

说明:

  • ^断言我们刚开始。
  • (?..)称为非捕获组,它不会捕获任何字符,但只会进行匹配操作。
  • [^az]*这将匹配任何字符零次或多次。
  • [az]这将匹配一个小写字母。
  • (?:[^az]*[az]){3}因此,如果整个非捕获组重复三次,它可以匹配至少三个小写字母的字符串。 仅出于测试目的,我们不需要进行完全匹配。

要么

你可以试试下面的积极前瞻。

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

码:

> /^(?=(?:[^a-z]*[a-z]){3})/.test("mYpAsSwOrD")
true
(?=(.*?[a-z]){3}).*

你可以试试这个。看看演示。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM