In http://www.javaregex.com/RegexRecipesV1.pdf, I found a nifty little
example which illustrates what I'm trying to do:
Pattern p = Pattern.compile("(?i)((apple|orange|banana)[\\s,]*)+");
String txt = "List some fruits: apple, orange, banana";
Matcher m = p.matcher(txt);
boolean found = m.find();
System.out.println(m.group());
// Prints "apple, orange, banana"
System.out.println(m.group(1));
// Prints "banana"
System.out.println(m.group(2));
// Prints "banana"
Notice how it grabs "banana", but not "apple" or "orange". I'm
thinking it should match all three, for a total of 6 groups. Is there
a way to match all six without introducing a while (m.find()) loop?
Joshua Cranmer - 09 Sep 2007 23:26 GMT
> In http://www.javaregex.com/RegexRecipesV1.pdf, I found a nifty little
> example which illustrates what I'm trying to do:
[quoted text clipped - 13 lines]
> thinking it should match all three, for a total of 6 groups. Is there
> a way to match all six without introducing a while (m.find()) loop?
Why, oh why, don't people bother to read documentation these days? I
will quote to you directly from the JavaDocs for java.util.regex.Pattern
The captured input associated with a group is always the subsequence
that the group *most recently matched.* If a group is evaluated a second
time because of quantification then its previously-captured value, if
any, will be retained if the second evaluation fails. [ Emphasis added ]
The short answer to your question is: no.

Signature
Beware of bugs in the above code; I have only proved it correct, not
tried it. -- Donald E. Knuth