How to capture an arbitrary number of groups in JavaScript Regexp?
I would expect this line of JavaScript:
"foo bar baz".match(/^(s*w+)+$/)
to return something like:
["foo bar baz", "foo", " bar", " baz"]
but instead it returns only the last captured match:
["foo bar baz", " baz"]
Is there a way to get all the captured matches?
When you repeat a capturing group, in most flavors, only the last capture is kept; any previous capture is overwritten. In some flavor, eg .NET, you can get all intermediate captures, but this is not the case with Javascript.
That is, in Javascript, if you have a pattern with N capturing groups, you can only capture exactly N strings per match, even if some of those groups were repeated.
So generally speaking, depending on what you need to do:
/(pattern)+/
, maybe match /pattern/g
, perhaps in an exec
loop References
Example
Here's an example of matching <some;words;here>
in a text, using an exec
loop, and then splitting on ;
to get individual words (see also on 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
The pattern used is:
_2__
/
<(w+(;w+)*)>
__________/
1
This matches <word>
, <word;another>
, <word;another;please>
, etc. Group 2 is repeated to capture any number of words, but it can only keep the last capture. The entire list of words is captured by group 1; this string is then split
on the semicolon delimiter.
Related questions
How's about this? "foo bar baz".match(/(w+)+/g)
除非你对如何分割字符串有更复杂的要求,你可以将它们分开,然后用它们返回最初的字符串:
var data = "foo bar baz";
var pieces = data.split(' ');
pieces.unshift(data);
链接地址: http://www.djcxy.com/p/21424.html
上一篇: 用于Linux的C ++ IDE?