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

87

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

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

например, " Какое-то неубедительное предложение, которое круто "

искать " предложение "

вернуть " это круто "

Любая помощь приветствуется

Пока это мое регулярное выражение

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");
}
Скотт
источник
Каков ваш настоящий вызов? Вы используете Matcher?
Grzegorz Oledzki
Я использую сопоставление и узор
Скотт
... и мы все равно хотели бы увидеть ваш реальный Java-код, чтобы помочь понять, что не так.
Стив Йоргенсен
System.out.println("I found the text: " + "some lame sentance that is aweomse".substring(end()));
Nishant
3
@DavidIsNotHere у нацистов должна быть заглавная буква N ...
Ли Тейлор

Ответы:

141

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

(?<=sentence).*

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

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

Тим Пицкер
источник
Вы заявляете, что оно не должно включать утверждение о положительном просмотре назад. Поэтому я предполагаю, что ". * (? <= Предложение)" должно возвращать все до, но не включая "предложение". Но это не так, он также возвращает «предложение». Что мне не хватает?
JJJones_3860
@ user2184214: Это потому , что это вид сзади утверждение. .*соответствует любому тексту, а затем (?<=...)ищет слово в обратном направлении sentence, утверждая в этом случае, что совпадение заканчивается этим словом. Если вы хотите остановиться перед этим словом, вам нужно смотреть вперед : .*(?=sentence)будет соответствовать любому тексту, за которым следует sentence.
Тим Пицкер 04
17

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

ул. никогда
источник
Спасибо, но что, если я просто хочу, чтобы оно вернулось «это круто»,
Скотт
Спасибо, чувак, это сработало отлично, я надеялся, что есть способ сделать это с помощью простого регулярного выражения, если я не смогу найти способ сделать это таким образом, это будет работать также
Скотт
Вероятно, плохая идея добавлять "(. *)" В конце регулярного выражения для производительности ...
Эрегон
8

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

Вывод:

это замечательно

Шон Патрик Флойд
источник
matcher.find()требуется перед этим, ИМО.
Nishant
@Nishant вот что я написал: "после матча". Добавлен пример кода для иллюстрации
Шон Патрик Флойд
1

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

Рами С
источник
1

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

System.out.println("I found the text: " + matcher.group(**1**).toString());
Рикардо Феррейра
источник