我希望这行JavaScript:
"foo bar baz".match(/^(\s*\w+)+$/)
返回类似:
["foo bar baz", "foo", " bar", " baz"]
但相反,它仅返回最后捕获的匹配项:
["foo bar baz", " baz"]
有没有办法获取所有捕获的比赛?
Answers:
在大多数情况下,当您重复一个捕获组时,仅保留最后一个捕获。以前的任何捕获都将被覆盖。以某种形式,例如.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
,此字符串位于分号分隔符上。
除非您对如何拆分字符串有更复杂的要求,否则可以拆分它们,然后使用它们返回初始字符串:
var data = "foo bar baz";
var pieces = data.split(' ');
pieces.unshift(data);