为了账号安全,请及时绑定邮箱和手机立即绑定

如何捕获JavaScriptRegexp中任意数量的组?

/ 猿问

如何捕获JavaScriptRegexp中任意数量的组?

HUX布斯 2019-07-09 14:51:46

如何捕获JavaScriptRegexp中任意数量的组?

我希望这一行JavaScript:

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

返回如下内容:

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

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

["foo bar baz", " baz"]

有没有办法得到所有捕获的火柴?


查看完整描述

3 回答

?
明月笑刀无情

当您重复一个捕获组时,在大多数情况下,只保留最后一个捕获;任何以前的捕获都会被覆盖。在某些方面,例如.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

所使用的模式是:

      _2__

     /    \

<(\w+(;\w+)*)>

 \__________/

      1

这个匹配<word><word;another><word;another;please>第二组重复捕获任意数量的单词,但只能保留最后一次捕获。整个单词列表由组1捕获;然后该字符串将被捕获。split在分号分隔符上。

相关问题


查看完整回答
反对 回复 2019-07-09
?
DIEA

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

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


查看完整回答
反对 回复 2019-07-09

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信