如何在 JavaScript 正则表达式中捕获任意数量的组?

2024-02-15

我期望这行 JavaScript 代码:

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

返回如下内容:

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

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

["foo bar baz", " baz"]

有没有办法获得所有捕获的比赛?


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

也就是说,在 Javascript 中,如果你有一个模式N捕获组,只能准确捕获N每场比赛的字符串,即使其中一些组是重复的。

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

  • 如果可以选择,则按分隔符进行分割
  • Instead of matching /(pattern)+/, maybe match /pattern/g, perhaps in an exec loop
    • 请注意,这两者并不完全等同,但它可能是一种选择
  • Do multilevel matching:
    • 在一场比赛中捕获重复的组
    • 然后运行另一个正则表达式来分解该匹配

参考

  • regular-expressions.info/Repeating a Capturing Group vs Capturing a Repeating Group http://www.regular-expressions.info/captureall.html
    • JavaScript 风味笔记 http://www.regular-expressions.info/javascript.html

Example

这是一个匹配的例子<some;words;here>在文本中,使用exec循环,然后分割;得到单个单词(另请参阅 ideone.com http://ideone.com/JOAEw):

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 正则表达式中的匹配组? https://stackoverflow.com/questions/432493/how-do-you-access-the-matched-groups-in-a-javascript-regex
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 JavaScript 正则表达式中捕获任意数量的组? 的相关文章

随机推荐