Почему сопоставление с RegEx работает только при установке точки останова? - PullRequest
1 голос
/ 14 января 2012

Следующий тест JUnit будет работать корректно только для меня, когда я установлю точку останова на строке соответствия.При нормальном запуске или отладке без точки останова произойдет сбой.

public class ParserTest {
@Test
public void test() {
    final String s = new Parser().parse("Hello(WORLD)");
}

public static class Parser {
    private static final Pattern pattern = Pattern
            .compile("([a-zA-Z\\s]*)\\(([A-Z]{5,5})\\)");

    public String parse(final String raw) {
        // put a breakpoint on the matcher in eclipse,
        // debug as junit test, then step over
        final Matcher matcher = pattern.matcher(raw);
        return matcher.group(2) + ":" + matcher.group(1);
    }
}
}

Выдается следующее исключение

java.lang.IllegalStateException: No match found
at java.util.regex.Matcher.group(Matcher.java:461)
at lab.ParserTest$Parser.parse(ParserTest.java:22)
at lab.ParserTest.test(ParserTest.java:11)

Я создаю книгу правил RegEx Planet Cookbook здесь и работает нормально.

Ответы [ 2 ]

2 голосов
/ 14 января 2012
    public String parse(final String raw) {
        // put a breakpoint on the matcher in eclipse,
        // debug as junit test, then step over
        final Matcher matcher = pattern.matcher(raw);
        if (matcher.matches()) {
            return matcher.group(2) + ":" + matcher.group(1);
        } else {
            throw new IllegalArgumentException();
        }
    }
2 голосов
/ 14 января 2012

Вам необходимо позвонить matcher.matches() до matcher.group(). Иногда проверка кода в отладчике приводит к изменению состояния объекта, потому что оно заставляет вещи оценивать. Я подозреваю, что это происходит здесь.

...