TL; DR
Каковы проектные решения для Matcher
API?
Фон
Matcher
имеет поведение, которого я не ожидал, и для которого я не могу найти вескую причину. В документации по API говорится:
После создания соединитель можно использовать для выполнения трех различных операций совпадения: [...] Каждый из этих методов возвращает логическое значение, указывающее на успех или неудачу. Более подробную информацию об успешном совпадении можно получить, запросив состояние совпадения.
В документации API далее говорится:
Явное состояние совпадения первоначально undefined; пытаясь запросить любую его часть перед успешным совпадением, будет выведено исключение IllegalStateException.
Пример
String s = "foo=23,bar=42";
Pattern p = Pattern.compile("foo=(?<foo>[0-9]*),bar=(?<bar>[0-9]*)");
Matcher matcher = p.matcher(s);
System.out.println(matcher.group("foo")); // (1)
System.out.println(matcher.group("bar"));
Этот код выдает
java.lang.IllegalStateException: No match found
at (1)
. Чтобы обойти это, необходимо вызвать matches()
или другие методы, которые приносят Matcher
в состояние, которое позволяет group()
. Следующие работы:
String s = "foo=23,bar=42";
Pattern p = Pattern.compile("foo=(?<foo>[0-9]*),bar=(?<bar>[0-9]*)");
Matcher matcher = p.matcher(s);
matcher.matches(); // (2)
System.out.println(matcher.group("foo"));
System.out.println(matcher.group("bar"));
Добавление вызова matches()
в (2)
устанавливает Matcher
в правильное состояние для вызова group()
.
Вопрос, возможно, не конструктивный
Почему этот API разработан так? Почему автоматическое совпадение при построении Matcher
с помощью Patter.matcher(String)
?