MadConan
MadConan

Reputation: 3767

How to capture all nested matches?

I was trying to answer a question recently and while attempting to solve it, I ran into a question of my own.

Given the following code

private void regexample(){
    String x = "a3ab4b5";

    Pattern p = Pattern.compile("(\\D+(\\d+)\\D+){2}");
    Matcher m = p.matcher(x);
    while(m.find()){
        for(int i=0;i<=m.groupCount();i++){
            System.out.println("Group " + i + " = " + m.group(i));
        }
    }
}

And the output

Group 0 = a3ab4b
Group 1 = b4b
Group 2 = 4

Is there any straight-forward way I'm missing to get the value 3? The pattern should look for two occurrences of (\\D+(\\d+)\\D+) back-to-back, and a3a is part of the match. I realize I can change expression to (\\D+(\\d+)\\D+) and then look for all matches, but that isn't technically the same thing. Is the only way to do a double search? ie: Use the given pattern to match the string and then search again for each count of the outer group?

I guessed that the first values were overwritten with the second, but as I'm not that great with regex, I was hoping there was something I was missing.

Upvotes: 1

Views: 120

Answers (1)

Tobias
Tobias

Reputation: 7771

It is impossible to capture multiple occurrences of the same group (with standard regex engines). You could use something like this:

Pattern.compile("(\\D+(\\d+)\\D+)(\\D+(\\d+)\\D+)");

Now, there are four groups instead of two, so you will get the values you expected.

This question deals with a similar problem.

Upvotes: 3

Related Questions