Javascript Regex/A?/g不匹配多个A';s

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成为可选的,因为它很贪婪,它不应该选择在第二个匹配中包含第二

为什么正则表达式只匹配字符串中的第一个大写字母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”,“,,”]