如何在JavaScript Regexp中捕获任意数量的组?

我期望这一行的JavaScript:

"foo bar baz".match(/^(\s*\w+)+$/) 

返回像这样的东西:

 ["foo bar baz", "foo", " bar", " baz"] 

但是它只返回最后捕获的匹配项:

 ["foo bar baz", " baz"] 

有没有办法让所有被捕的比赛?

当你重复一个捕捉组时,在大多数的风格中,只有最后一个捕捉被保留; 任何先前的捕捉都被覆盖。 在一些风格,如.NET,你可以得到所有的中间捕获,但这不是使用Javascript的情况。

也就是说,在Javascript中,如果您有一个包含N个捕获组的模式,即使这些组中有一些重复,每个匹配也只能捕获N个string。

所以一般来说,取决于你需要做什么:

  • 如果它是一个选项,而不是分隔符
  • 而不是匹配/(pattern)+/ ,也许在一个exec循环中匹配/pattern/g
    • 请注意,这两个不完全相同,但它可能是一个选项
  • 做多级匹配:
    • 捕捉一场比赛中的重复组
    • 然后运行另一个正则expression式来打破这个匹配

参考

  • regular-expressions.info/重复捕获组vs捕获重复组
    • Javascript风味笔记

下面是一个在文本中使用exec循环匹配<some;words;here>的例子,然后分裂; 获取单个词( 另请参见ideone.com ):

 var text = "a;b;<c;d;e;f>;g;h;i;<no no no>;j;k;<xx;yy;zz>"; var r = /<(\w+(;\w+)*)>/g; var match; while ((match = r.exec(text)) != null) { print(match[1].split(";")); } // c,d,e,f // xx,yy,zz 

使用的模式是:

  _2__ / \ <(\w+(;\w+)*)> \__________/ 1 

这匹配<word><word;another><word;another;please>等。组2重复捕获任意数量的单词,但它只能保留上次捕获。 整个单词列表由组1捕获; 这个string然后被split在分号分隔符上。

相关问题

  • 如何访问JavaScript正则expression式中的匹配组?

这个怎么样? "foo bar baz".match(/(\w+)+/g)

除非您对分割string的方式有更复杂的要求,否则可以将它们分开,然后返回最初的string:

 var data = "foo bar baz"; var pieces = data.split(' '); pieces.unshift(data); 

尝试使用'g':

 "foo bar baz".match(/\w+/g)