Confusion in JavaScript RegExp ?= Quantifier

时间:2018-02-03 11:00:47

标签: regex

What the difference between

(?=.\d)(?=.[a-z])(?=.[A-Z]) 

and

(.\d)(.[a-z])(.[A-Z])

When I test the string a2A only the first RegExp returns true. Can anyone explain this for me?

1 个答案:

答案 0 :(得分:1)

区别在于正则表达式中每个术语的前瞻操作符。 LA操作符像往常一样匹配它守卫的子正则表达式,但有效地锁定后续正则表达式部分的初始匹配位置。

这意味着第一个正则表达式不匹配(与您的测试相反,您使用了哪个引擎?) - 给定任何初始匹配位置,第二个字符必须是数字,小写字母和大写字母,都是在同一时间。

注意如果.('任何字符串')被量化,就不会发生这种情况:

(?=.*\d)(?=.*[a-z])(?=.*[A-Z]) 

每个LA术语在匹配字符类之前可以跳过任意数量的材料,并且这个数量可能在子表达式之间有所不同。

第二种选择(有和没有量化)永远不会匹配,因为它总是需要一个数字字母的子序列,测试字符串a2A不提供。