我希望这行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循环匹配文本,然后分割;成单个单词的示例:
<some;words;here>
;
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,此字符串位于分号分隔符上。
<word>
<word;another>
<word;another;please>
split