Мэтчер находит шаблон, но выбрасывает Нет совпадений по методу `start` - PullRequest
0 голосов
/ 17 февраля 2020

Я хочу получить подстроку текста после регулярного выражения, поэтому я проверяю, существует ли она с find, затем я пытаюсь получить start / end / group, но java.lang.IllegalStateException: No match available Брошенный.

String text = "Hello bob, remind me to do a lot of things today";
pattern = Pattern.compile("remind.*.to.");
// Looking for "remind <anyWord> to "
if (pattern.matcher(text).find())
{
    pattern.matcher(text).group();
}

Регулярное выражение найдено, поэтому я в условии, но start() (/ любой другой метод int) выдает исключение.

Ответы [ 2 ]

3 голосов
/ 17 февраля 2020

Вы должны позвонить pattern.matcher(text) один раз, чтобы сделать это, просто создайте Matcher примерно так:

Matcher matcher = pattern.matcher(text);
if (matcher.find()) {
    String result = matcher.group();
    //output: "remind me to do a lot of things tod"
}
3 голосов
/ 17 февраля 2020

Проблема в том, что вы снова используете pattern.matcher(text), и это создает еще один экземпляр Matcher, и когда вы вызываете start() для нового экземпляра, выдается исключение, поскольку find или matches или lookingAt не имеет был вызван раньше.

Вы можете использовать его следующим образом:

String text = "Hello bob, remind me to do a lot of things today";
final Pattern pattern = Pattern.compile("remind.*\\hto\\h");
Matcher m = pattern.matcher(text); // create it only once
// Looking for "remind <anyWord> to "
if (m.find()) {
    System.err.println( "Start: " + m.start() + ", match: " + m.group() );
}

Также обратите внимание на изменения в вашем регулярном выражении. \h соответствует горизонтальному пробелу, тогда как .to. будет соответствовать любому символу до и после to, следовательно, ваше регулярное выражение будет соответствовать:

"remind me to do a lot of things tod"

вместо предполагаемого:

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