Monday, May 20, 2024
 Popular · Latest · Hot · Upcoming
171
rated 0 times [  177] [ 6]  / answers: 1 / hits: 48601  / 14 Years ago, sat, august 21, 2010, 12:00:00

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?


More From » regex

 Answers
28

When you repeat a capturing group, in most flavors, only the last capture is kept; any previous capture is overwritten. In some flavor, e.g. .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:




  • If it's an option, split on delimiters instead

  • Instead of matching /(pattern)+/, maybe match /pattern/g, perhaps in an exec loop


    • Do note that these two aren't exactly equivalent, but it may be an option


  • Do multilevel matching:


    • Capture the repeated group in one match

    • Then run another regex to break that match apart




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




[#95855] Wednesday, August 18, 2010, 14 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
sandra

Total Points: 708
Total Questions: 100
Total Answers: 84

Location: Bosnia and Herzegovina
Member since Thu, Jun 24, 2021
3 Years ago
sandra questions
Tue, Jun 30, 20, 00:00, 4 Years ago
Sun, May 31, 20, 00:00, 4 Years ago
Wed, May 20, 20, 00:00, 4 Years ago
Fri, May 31, 19, 00:00, 5 Years ago
;