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

时间:2010-08-21 14:08:25

标签: javascript regex repeat capturing-group

我希望这行JavaScript:

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

返回类似的内容:

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

但它只返回最后一次捕获的匹配:

["foo bar baz", " baz"]

有没有办法获得所有捕获的匹配?

4 个答案:

答案 0 :(得分:77)

当您重复捕获组时,在大多数情况下,只保留最后一次捕获;以前的任何捕获都会被覆盖。在一些风味中,例如.NET,您可以获得所有中间捕获,但Javascript不是这种情况。

也就是说,在Javascript中,如果你有一个带有 N 捕获组的模式,你只能在每次匹配时捕获完全 N 个字符串,即使其中一些组是重复。

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

  • 如果是一个选项,则拆分分隔符
  • 可能在/(pattern)+/循环中匹配/pattern/g,而不是匹配exec
    • 请注意,这两者并不完全相同,但可能是一个选项
  • 进行多级匹配:
    • 在一场比赛中捕获重复的组
    • 然后运行另一个正则表达式以打破该匹配

参考


实施例

以下是使用<some;words;here>循环在文本中匹配exec,然后在;上拆分以获取单个字词see also on 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组捕获;然后,此字符串在分号分隔符上为split

相关问题

答案 1 :(得分:7)

这是怎么回事? "foo bar baz".match(/(\w+)+/g)

答案 2 :(得分:5)

除非你对如何拆分字符串有更复杂的要求,否则你可以拆分它们,然后用它们返回初始字符串:

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

答案 3 :(得分:4)

尝试使用'g':

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