Javascript:如何在RegEx .exec结果中获得多个匹配项

当我跑步

/(a)/g.exec('aaa ').length 

我明白了

 2 

但我认为它应该返回

 3 

因为弦中有3 a s,而不是2个!

这是为什么?

我希望能够search正则expression式中的所有string,并迭代它们。

FWIW:我正在使用node.js

exec()只返回第一个匹配的捕获集合,而不是你所期望的匹配集合。 所以你真正看到的是$0 (整个匹配“a”)和$1 (第一个捕获) – 即一个长度为2的数组exec()同时被devise为可以再次调用它来获得捕获一场比赛。 来自MDN :

如果您的正则expression式使用“g”标志,则可以多次使用exec方法在同一个string中查找连续的匹配项。 当你这样做的时候,search从正则expression式的lastIndex属性指定的str的子string开始(test也将提前lastIndex属性)。

你可以使用match来代替:

 'aa a'.match(/(a)/g).length // outputs: 3 

你只匹配第一个。 长度为2的原因是find第一个匹配的第一个匹配和加括号的组部分。 在你的情况下,他们是一样的。

考虑这个例子。

 var a = /b(a)/g.exec('ba ba ba '); alert(a); 

它输出ba, a 。 数组长度仍然是2,但是更明显的是怎么回事。 “ba”是完整的匹配。 a是加括号的第一个分组比赛。

MDN文档支持 – 只返回第一个匹配项和包含的组。 要find所有的匹配,你可以使用mVChr指定的match()。

码:

 alert('aa a'.match(/(a)/g).length); 

输出:

 3