Подтвердить что ты не робот

Получение текста после соответствия регулярному выражению

Я новичок в использовании Regex, я проходил рейк учебников, но я не нашел того, что относится к тому, что я хочу делать,

Я хочу что-то искать, но возвращаю все, что следует за ним, но не сама строка поиска

например. "Некоторое хромое предложение, которое является удивительным"

найти "предложение"

return ", что является удивительным"

Любая помощь будет высоко оценена

Это мое регулярное выражение

sentence(.*) 

но он возвращает: предложение, которое является удивительным

Pattern pattern = Pattern.compile("sentence(.*)");

Matcher matcher = pattern.matcher("some lame sentence that is awesome");

boolean found = false;
while (matcher.find())
{
    System.out.println("I found the text: " + matcher.group().toString());
    found = true;
}
if (!found)
{
    System.out.println("I didn't find the text");
}
4b9b3361

Ответ 1

Вы можете сделать это с помощью "просто регулярного выражения", как вы просили в комментарии:

(?<=sentence).*

(?<=sentence) является положительным утверждением lookbehind. Это соответствует определенной позиции в строке, а именно в позиции сразу после текста sentence, не сделав сам этот текст частью совпадения. Следовательно, (?<=sentence).* будет соответствовать любому тексту после sentence.

Это довольно приятная функция регулярного выражения. Однако в Java это будет работать только для подвыражений конечной длины, т.е. е. (?<=sentence|word|(foo){1,4}) является законным, но (?<=sentence\s*) не является.

Ответ 2

Ваше регулярное выражение "sentence(.*)" правильно. Чтобы получить содержимое группы в скобках, вы должны вызвать:

Pattern p = Pattern.compile( "sentence(.*)" );
Matcher m = p.matcher( "some lame sentence that is awesome" );
if ( m.find() ) {
   String s = m.group(1); // " that is awesome"
}

Обратите внимание на использование m.find() в этом случае (попытки найти в любом месте строки), а не m.matches() (сбой из-за префикса "некоторая хромая", в этом случае регулярное выражение должно быть ".*sentence(.*)")

Ответ 3

если Matcher инициализируется с помощью str, после матча вы можете получить часть после матча с помощью

str.substring(matcher.end())

Пример кода:

final String str = "Some lame sentence that is awesome";
final Matcher matcher = Pattern.compile("sentence").matcher(str);
if(matcher.find()){
    System.out.println(str.substring(matcher.end()).trim());
}

Вывод:

что является удивительным

Ответ 4

Вам нужно использовать группу (int) вашей группы-матчи (0) - это полное совпадение, а группа (1) - первая группа, которую вы отметили. В указанном примере группа (1) - это то, что приходит после " предложение".

Ответ 5

Вам просто нужно поместить "group (1)" вместо "group()" в следующую строку, и будет возвращаться тот, который вы ожидали:

System.out.println("I found the text: " + matcher.group(**1**).toString());