простое java regex throwing wrongstateexception

Я пытаюсь сделать быструю проверку здравомыслия … и ее провал. Вот мой код –

import java.util.regex.*; public class Tester { public static void main(String[] args) { String s = "a"; Pattern p = Pattern.compile("^(a)$"); Matcher m = p.matcher(s); System.out.println("group 1: " +m.group(1)); } } 

И я бы ожидал увидеть group 1: a . Но вместо этого я получаю IllegalStateException: no match found и я понятия не имею, почему.

Изменить: я также groupCount() распечатать groupCount() и он говорит, что есть 1.

Вы должны m.find() вызвать m.find() или m.matches() чтобы иметь возможность использовать m.group .

  • find можно использовать для поиска каждой подстроки, соответствующей вашему шаблону (используется в основном в ситуациях, когда имеется более одного совпадения)
  • matches проверит, соответствует ли целая строка вашему шаблону, поэтому вам даже не нужно добавлять ^ и $ в свой шаблон.

Мы также можем использовать m.lookingAt() но теперь давайте пропустим его описание (вы можете прочитать его в документации).

Используйте совпадения Matcher # или Matcher # find до вызова Matcher.group(int)

 if (m.find()) { System.out.println("group 1: " +m.group(1)); } 

В этом случае Matcher#find более подходит, так как Matcher#matches совпадений соответствует полной String (что делает якорные символы избыточными в соответствующем выражении)

Посмотрите на javadocs для Matcher . Вы увидите, что «попытка запросить любую его часть до успешного совпадения приведет к выбросу IllegalStateException».

Оберните свою group(1) вызовом с помощью if (matcher.find()) {} чтобы решить эту проблему.

  • Используйте String.split () с несколькими разделителями
  • Есть ли программное обеспечение, позволяющее мне искать PDF-файл с помощью Regex?
  • Использование Java для поиска подстроки большей строки с использованием регулярного выражения
  • Как выводить только захваченные группы с sed?
  • Новые строки в sed на Mac OS X
  • Исключение регулярного выражения JavaScript (недопустимая группа)
  • Как именно метод String.split () в Java работает при регулярном выражении?
  • Notepad ++ как скопировать текст (только), который соответствует выражению регулярного выражения (не всей строки)
  • Регулярное выражение для пароля должно содержать не менее восьми символов, как минимум одно число и буквы нижнего и верхнего регистра и специальные символы
  • hive regexp_extract weirdness
  • Использование регулярных выражений для извлечения значения в Java
  • Давайте будем гением компьютера.