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

我期望这一行的JavaScript:

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

返回如下所示的内容:

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

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

["foo bar baz", " baz"]

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


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

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

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

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

  • 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组捕获; 这个字符串被split为分号分隔符。

    相关问题

  • 如何访问javascript正则表达式中的匹配组?

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


    除非你对如何分割字符串有更复杂的要求,你可以将它们分开,然后用它们返回最初的字符串:

    var data = "foo bar baz";
    var pieces = data.split(' ');
    pieces.unshift(data);
    
    链接地址: http://www.djcxy.com/p/21423.html

    上一篇: How to capture an arbitrary number of groups in JavaScript Regexp?

    下一篇: Regex to detect one of several strings