我想要一个正则表达式,当至少有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}
宽松,因此它不应允许接受测试吗?
答案 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上了解有关该行为的更多信息。