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

dis*_*cer 77 javascript regex repeat capturing-group

我希望这行JavaScript:

"foo bar baz".match(/^(\s*\w+)+$/)
Run Code Online (Sandbox Code Playgroud)

返回类似的东西:

["foo bar baz", "foo", " bar", " baz"]
Run Code Online (Sandbox Code Playgroud)

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

["foo bar baz", " baz"]
Run Code Online (Sandbox Code Playgroud)

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

pol*_*nts 85

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

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

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

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

参考


这是一个<some;words;here>在文本中匹配,使用exec循环,然后拆分;以获取单个单词的示例(另请参见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
Run Code Online (Sandbox Code Playgroud)

使用的模式是:

      _2__
     /    \
<(\w+(;\w+)*)>
 \__________/
      1
Run Code Online (Sandbox Code Playgroud)

这符合<word>,<word;another>,<word;another;please>,等2组重复捕捉到任何数量的话,但它只能保存最近捕获.整个单词列表由第1组捕获; 然后这个字符串split在分号分隔符上.

相关问题


med*_*iev 7

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


g.d*_*d.c 6

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

var data = "foo bar baz";
var pieces = data.split(' ');
pieces.unshift(data);
Run Code Online (Sandbox Code Playgroud)

  • 这最终只是我需要唤醒我的一条建议,至少对于我当前的应用程序,我不需要比 split() 更复杂的任何东西。 (2认同)