为什么连续先行并不总是有效

时间:2018-08-16 11:46:35

标签: javascript regex

我想要一个正则表达式,当至少有5个字符和2个数字时返回true。为此,我使用了超前(即(?=...))。

// this one works
let pwRegex = /(?=.{5,})(?=\D*\d{2})/;
let result = pwRegex.test("bana12");

console.log("result", result) // true

// this one won't
pwRegex = /(?=.{5,})(?=\d{2})/;
result = pwRegex.test("bana12");

console.log("result", result) // false

为什么我们需要添加\D*才能使其正常工作?

对我来说,\d{2}\D*\d{2}宽松,因此它不应允许接受测试吗?

2 个答案:

答案 0 :(得分:2)

仅在当前比赛位置进行前瞻测试。由于您没有任何匹配项,因此从一开始就意味着。由于bana12不能以两位数字开头,因此\d{2}失败。就这么简单;)

此外,请注意,拥有\d{2}意味着您的数字必须相邻。那是你的意图吗?

要只需要2位数字,不需要相邻,请尝试

/(?=.{5,})(?=\D*\d\D*\d)/

答案 1 :(得分:1)

请注意,先行是零宽度的断言,当它们的模式匹配时,正则表达式索引将停留在以前的位置。上面的模式中的前瞻在相同的位置执行。

/(?=.{5,})(?=\d{2})/模式将匹配一个位置,该位置除了当前位置紧靠换行符之外的任何5个字符 ,并且这5个字符的子字符串中的前2个字符为数字。

您需要添加\D*来让其他类型的字符位于2位数字之前。

Lookarounds Stand their Ground上了解有关该行为的更多信息。