Получение текста, следующего после совпадения регулярных выражений


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

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

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

поиск "наказание"

возвращения "это потрясающе"

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

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

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");
}
5 53

5 ответов:

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

(?<=sentence).*

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

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

регулярное выражение "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(.*)")

Если 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());
}

выход:

Это потрясающе

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

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

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