Группа захвата регулярного выражения с необязательным разделителем - PullRequest
1 голос
/ 31 марта 2011

Выглядит как простая проблема, мне нужно извлечь группу захвата и при желании ограничить группу строкой-разделителем.

В приведенном ниже примере я предоставляю строку-разделитель 'cd' и ожидаю, что онавернул бы 'ab' во всех случаях: 'ab', 'abcd' и 'abcdefg'

Вот код:

public static void main(String[] args) {
    String expected = "ab"; // Could be more or less than two characters
    String[] tests = {"ab", "abcd", "abcdefg"};
    Pattern pattern = Pattern.compile("(.*)cd?.*");

    for(String test : tests) {
        Matcher match = pattern.matcher(test);
        if(match.matches()) {
            if(expected.equals(match.group(1)))
                System.out.println("Capture Group for test: " + test + " - " + match.group(1));
            else System.err.println("Expected " + expected + " but captured " + match.group(1));
        } else System.err.println("No match for " + test);
    }
}

Вывод:


    No match for ab
    Capture Group for test: abcd - ab
    Capture Group for test: abcdefg - ab

Я думал, что прогноз может работать, но я не думаю, что есть вариант, который является необязательным (т. Е. Ноль или более экземпляров)

Ответы [ 2 ]

4 голосов
/ 31 марта 2011

Попробуйте это:

Pattern pattern = Pattern.compile("(.*?)(?:cd.*|$)");

.*? не является жадным, а остальное регулярное выражение соответствует либо cd, за которым следует что-либо, либо конец строки.

0 голосов
/ 31 марта 2011

Я думаю, что ваша единственная проблема может заключаться в том, что ? применяется только к d. Попробуйте (cd)? вместо.

...