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