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

如何在JavaScript Regexp中捕获任意数量的组?,javascript,regex,repeat,capturing-group,Javascript,Regex,Repeat,Capturing Group,我希望这一行JavaScript: "foo bar baz".match(/^(\s*\w+)+$/) 返回如下内容: ["foo bar baz", "foo", " bar", " baz"] 但它只返回最后捕获的匹配: ["foo bar baz", " baz"] 有没有办法获取所有捕获的匹配项?这个怎么样“foo bar baz”。匹配(/(\w+)+//g)除非您对如何拆分字符串有更复杂的要求,否则可以拆分字符串,然后返回初始字符串: var data = "foo bar

我希望这一行JavaScript:

"foo bar baz".match(/^(\s*\w+)+$/)
返回如下内容:

["foo bar baz", "foo", " bar", " baz"]
但它只返回最后捕获的匹配:

["foo bar baz", " baz"]

有没有办法获取所有捕获的匹配项?

这个怎么样<代码>“foo bar baz”。匹配(/(\w+)+//g)

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

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

在大多数情况下,当你重复一个捕获组时,只保留最后一个捕获;任何以前的捕获都将被覆盖。在某些风格中,例如.NET,您可以获得所有中间捕获,但Javascript并非如此

也就是说,在Javascript中,如果您有一个包含N个捕获组的模式,那么每次匹配只能捕获N个字符串,即使其中一些组被重复

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

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

例子 下面是一个在文本中匹配
的示例,使用
exec
循环,然后在
上拆分获取单个单词():

var text=“a;b;g;h;i;j;k;”;
var r=//g;
var匹配;
while((match=r.exec(text))!=null){
打印(匹配[1]。拆分(;));
}
//c、d、e、f
//xx,yy,zz
所使用的模式是:

      _2__
     /    \
<(\w+(;\w+)*)>
 \__________/
      1
\u 2__
/    \
\__________/
1.
这与
等匹配。重复组2以捕获任意数量的单词,但它只能保留最后一次捕获。组1捕获整个单词列表;然后在分号分隔符上拆分该字符串

相关问题
尝试使用“g”:

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

您的代码可以工作,但是向我的示例中添加一个全局标志并不能解决问题:“foo bar baz”。match(/^(\s*\w+)+$/g)将返回[“foo bar baz”],如果您将其更改为下面的@Jet正则表达式,它将工作<代码>“foo-bar-baz”。匹配(/\w+/g)/=>[“foo”、“bar”、“baz”]
。它忽略了前面匹配的字符串,但仍然是一个合理的选择。这正是我需要提醒自己的一条建议,至少对于我当前的应用程序来说,我不需要比split()更复杂的东西。
"foo bar baz".match(/\w+/g)