получение значений NULL из Java Regex Matcher с найденным шаблоном - PullRequest
2 голосов
/ 31 марта 2012

Я пытаюсь заставить следующее регулярное выражение работать с моей строкой:

Pattern Regex = Pattern.compile("(?:(\\d+) ?(days?|d) *?)?(?:(\\d+) ?(hours?|h) *?)?(?:(\\d+) ?(minutes?|m) *?)?(?:(\\d+) ?(seconds?|s))?",
Pattern.CANON_EQ | Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE);
Matcher RegexMatcher = Regex.matcher(myString);
while (RegexMatcher.find()) {
       ...
}

.. это в основном разбивает строку типа 1 день 3 часа на соответствующие группы регулярных выражений.

Проблема, с которой я столкнулся, заключается в том, что при входе в цикл while вызовы RegexMatcher.group(i) всегда возвращают значение NULL, означающее, что они не были найдены в строке.

Когда я пытаюсь вывести RegexMatcher.group(0), он возвращает пустую строку, хотя myString определенно содержит как "hello 1d" - который должен вернуть по крайней мере 1-ую группу как "1", а вторую как "d".

Я проверил и дважды проверил регулярное выражение, и, похоже, все в порядке. Понятия не имею, что здесь не так.

Спасибо за любые идеи: -)

1 Ответ

2 голосов
/ 31 марта 2012

Для соответствия m, входной последовательности s и группового индекса g выражения m.group(g) и s.substring(m.start(g), m.end(g)) эквивалентны.

Группы захвата индексируются слева направо, начиная с единицы. Группа ноль обозначает весь шаблон, поэтому выражение m.group(0) эквивалентно m.group().

Если сопоставление прошло успешно, но указанная группа не смогла сопоставить какую-либо часть входной последовательности, то возвращается null. Обратите внимание, что некоторые группы, например (a*), соответствуют пустой строке. Этот метод возвращает пустую строку, когда такая группа успешно соответствует пустой строке во входных данных.

Если вы хотите эргодировать все совпадения, вы можете написать так:

Pattern Regex = Pattern
            .compile(
                    "(?:(\\d+) ?(days?|d) *?)?(?:(\\d+) ?(hours?|h) *?)?(?:(\\d+) ?(minutes?|m) *?)?(?:(\\d+) ?(seconds?|s))?",
                    Pattern.CANON_EQ | Pattern.CASE_INSENSITIVE
                            | Pattern.UNICODE_CASE);
    Matcher RegexMatcher = Regex.matcher("1 d 3 hours");
    while (RegexMatcher.find()) {
        System.out.println(RegexMatcher.group());
    }

Примечание : m.group() эквивалентно m.group(0)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...