Javascript Regex/A?/g不匹配多个A';s
为什么正则表达式只匹配字符串中的第一个大写字母A?据我所知,如果我执行以下代码Javascript Regex/A?/g不匹配多个A';s,javascript,regex,Javascript,Regex,为什么正则表达式只匹配字符串中的第一个大写字母A?据我所知,如果我执行以下代码 reg = /A?/g; match1 = reg.exec('AaAa'); match2 = reg.exec('AaAa'); match3 = reg.exec('AaAa'); console.log(match1, match2, match3); //["A"], [""],[""] 我无法捕捉第二次出现的“A”。为什么?在我看来,即使?使A成为可选的,因为它很贪婪,它不应该选择在第二个匹配中包含第二
reg = /A?/g;
match1 = reg.exec('AaAa');
match2 = reg.exec('AaAa');
match3 = reg.exec('AaAa');
console.log(match1, match2, match3); //["A"], [""],[""]
我无法捕捉第二次出现的“A”。为什么?在我看来,即使?使A成为可选的,因为它很贪婪,它不应该选择在第二个匹配中包含第二个“A”吗?当您使用
exec
时,正则表达式对象“记住”上一个匹配的索引
让我们记录lastIndex
的值:
reg = /A?/g;
reg.exec('AaAa');
console.log(reg.lastIndex); // 1
reg.exec('AaAa');
console.log(reg.lastIndex); // 1
reg.exec('AaAa');
console.log(reg.lastIndex); // 1
正如您所看到的,上一次匹配的索引没有改变!但是为什么呢
原因是正则表达式包含可选匹配(?
)
第二次调用exec
时,它尝试将索引1中的字符“a”
与a?
匹配。这是因为A?
表示字符的可选出现,即它基本上与“A”
之前的空字符串匹配。但这也意味着输入字符没有实际使用,因此索引没有增加。这是一场零宽度的比赛
同一过程的可视化方式不同:
AaAa // does index 0 match "A?" ? Yes, consume "A" and increase index to 1
^
AaAa // does index 1 match "A?" ? Yes, but do not consume "a"
^
AaAa // does index 1 match "A?" ? Yes, but do not consume "a"
^
...
调用exec
只会继续匹配第二个“a”
如果您将字符设置为非可选字符,它将按照您的预期工作。我不知道,但我总是以另一种方式执行:
“AaAa”。匹配(/A?/g)
显示[“A”,“A”,“A”,“,,”]
。