Группы захвата печати шаблона Java

((\d{1,2})/(\d{1,2})/(\d{2,4}))

Есть ли способ получить список всех групп захвата с помощьюPattern объект. Я отладил объект, и все, что он говорит, - это сколько групп (5).

Мне нужно получить список следующих групп захвата.

Пример вывода:

0 ((\d{1,2})/(\d{1,2})/(\d{2,4}))
1 (\d{2})/(\d{2})/(\d{4})
2 \d{2}
3 \d{2}
4 \d{4}

Обновить:

Я не обязательно спрашиваю, существует ли регулярное выражение, но это было бы наиболее благоприятным. До сих пор я создал элементарный синтаксический анализатор (я не проверяю большинство вне границ), который соответствует только самым внутренним группам. Я хотел бы знать, есть ли способ держать ссылку на уже посещенные скобки. Возможно, мне придется реализовать древовидную структуру?

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;

public class App {

    public final char S = '(';
    public final char E = ')';
    public final char X = '\\';

    String errorMessage = "Malformed expression: ";

    /**
     * Actual Output:
     *    Groups: [(//), (\d{1,2}), (\d{1,2}), (\d{2,4})]
     * Expected Output:
     *    Groups: [\\b((\\d{1,2})/(\\d{1,2})/(\\d{2,4}))\\b, ((\\d{1,2})/(\\d{1,2})/(\\d{2,4})), (\d{1,2}), (\d{1,2}), (\d{2,4})]
     */

    public App() {
        String expression = "\\b((\\d{1,2})/(\\d{1,2})/(\\d{2,4}))\\b";
        String output = "";

        if (isValidExpression(expression)) {
            List groups = findGroups(expression);
            output = "Groups: " + groups;
        } else {
            output = errorMessage;
        }

        System.out.println(output);
    }

    public List findGroups(String expression) {
        List groups = new ArrayList();
        int[] pos;
        int start;
        int end;
        String sub;
        boolean done = false;

        while (expression.length() > 0 && !done) {
            pos = scanString(expression);
            start = pos[0];
            end = pos[1];

            if (start == -1 || end == -1) {
                done = true;
                continue;
            }

            sub = expression.substring(start, end);
            expression = splice(expression, start, end);
            groups.add(0, sub);
        }

        return groups;
    }

    public int[] scanString(String str) {
        int[] range = new int[] { -1, -1 };
        int min = 0;
        int max = str.length() - 1;
        int start = min;
        int end = max;
        char curr;

        while (start  -1 && end 

Ответы на вопрос(1)

Ваш ответ на вопрос