我希望这行 JavaScript:
"foo bar baz".match(/^(\s*\w+)+$/)
返回类似的东西:
["foo bar baz", "foo", " bar", " baz"]
但它只返回最后捕获的匹配项:
["foo bar baz", " baz"]
有没有办法获得所有捕获的匹配项?
我希望这行 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
循环中
这是<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>
等。重复第 2 组以捕获任意数量的单词,但它只能保留最后一个捕获。整个单词列表由第 1 组捕获;该字符串位于split
分号分隔符上。
这个怎么样? "foo bar baz".match(/(\w+)+/g)
除非您对如何拆分字符串有更复杂的要求,否则可以拆分它们,然后用它们返回初始字符串:
var data = "foo bar baz";
var pieces = data.split(' ');
pieces.unshift(data);
尝试使用“g”:
"foo bar baz".match(/\w+/g)
您可以使用 LAZY 评估。因此,不要使用 * (GREEDY),而是尝试使用 ? (懒惰的)
正则表达式:(\s*\w+)?
结果:
匹配 1: foo
比赛 2:酒吧
第 3 场比赛:巴兹