Как получить все подходящие части для регулярного выражения

Я должен разобрать строку в 3 этапа. Работает только первый этап, на 2 и 3 этапах matcher.groupCount() возвращает 0 - что означает, что ничего не найдено. Я проверял свое регулярное выражение в онлайн-тестере, и это было просто прекрасно. Но здесь это не работает. Итак, вопрос в том, может быть, я что-то упустил, или в регулярном выражении есть ошибка?

String rawText = "ashjdajsdg:[requiredPartForFirstPattern]}asdassdasd";
Pattern firstPattern = Pattern.compile("(:\\[)(.*?)(\\]})");
List<String> firstList = parseContent(rawText, firstPattern);

После выполнения firstList должен содержать только одно значение (в данном случае): "requiredPartForFirstPattern" (может быть любой символ или любая последовательность символов).

Теперь я перебираю все значения в firstList и проверяю их с помощью шаблона 2:

Все значения в firstList будут иметь такую ​​форму: "[someText1],[someText2],[someText3]".

String rawText = "[someText1],[someText2],[someText3]"; 
Pattern secondPattern = Pattern.compile("(\\[([^]]*)\\])");
List<String> secondList = parseContent(rawText, secondPattern);

После выполнения secondList должен содержать следующие значения (в данном случае): "someText1","someText2","someText3".

И наконец третий этап. Я перебираю все значения в secondList и проверяю их по 3 шаблонам. Все значения в secondList будут иметь такую ​​форму: "someValue1" someValue2 ".

String rawText = "'someValue1','someValue2'";
Pattern thirdPattern = Pattern.compile("('(.*?)')");
List<String> thirdList = parseContent(rawText, secondPattern);

После выполнения secondList должен содержать следующие значения (в данном случае): "someValue1","someValue2".

Мой метод parseContent:

    private List<String> parseContent(String content, Pattern pattern) {
        List<String> matchedList = new LinkedList<>();

        Matcher matcher = pattern.matcher(content);
        if (matcher.find()) {
            for(int matchIndex = 0; matchIndex < matcher.groupCount(); ++matchIndex) {
                matchedList.add(matcher.group(matchIndex));
            }
        }
        return matchedList;
    }

1 ответ

Решение

Вы должны иметь while (matcher.find()) вместо оператора if.

if (matcher.find()) {
    for(int matchIndex = 0; matchIndex < matcher.groupCount(); ++matchIndex) {
        matchedList.add(matcher.group(matchIndex));
    }
}

Я заменил приведенный выше код на этот:

while (matcher.find()) {
    matchedList.add(matcher.group(1));
}

Работает нормально, ты за помощь.

Другие вопросы по тегам