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

#regex #ansible

#java #регулярное выражение

Вопрос:

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

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

например, «Какое-то убогое предложение, которое является потрясающим«

поиск по «предложению«

возвращает «это потрясающе«

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

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

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

Комментарии:

1. Каков ваш фактический вызов? Используете ли вы Matcher ?

2. Я использую сопоставитель и шаблон

3. … и мы все еще хотели бы увидеть ваш фактический Java-код, чтобы помочь оценить, что не так.

4. System.out.println("I found the text: " "some lame sentance that is aweomse".substring(end()));

5. У @DavidIsNotHere Nazi должна быть заглавная буква N…

Ответ №1:

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

 (?<=sentence).*
  

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

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

Комментарии:

1. Вы заявляете, что оно не должно включать положительное утверждение lookbehind. Итак, я предполагаю, что «.*(? <=предложение)» должно возвращать все вплоть до, но не включая «предложение». Но это не так, оно также возвращает «предложение». Чего мне не хватает?

2. @user2184214: Это потому, что это взгляд за утверждением. .* сопоставляет любой текст, а затем (?<=...) ищет слово sentence в обратном направлении, утверждая в этом случае, что совпадение заканчивается этим словом. Если вы хотите остановиться перед этим словом, вам нужно заглянуть вперед : .*(?=sentence) будет соответствовать любому тексту, за которым следует sentence .

3. Для тех, кто ищет способ сопоставить любой текст после той или иной строки, могут сработать такие регулярные выражения, как (?<=sentence1|sentence2).* , (?:(?<=sentence1)|(?<=sentence2)).* или даже (?:sentence1|sentence2)(.*) .

4. Большое спасибо! Я использовал ваш ответ, чтобы найти все после знака плюс. Итак, просто для другого примера: (?<= ).*

Ответ №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() (потерпит неудачу из-за префикса «some lame»; в этом случае регулярное выражение должно быть ".*sentence(.*)" )

Комментарии:

1. Спасибо, но что, если я просто хочу, чтобы он вернул «это потрясающе»

2. Спасибо, чувак, это отлично сработало, я надеялся, что есть способ сделать это только с помощью регулярного выражения, если я не могу найти способ сделать это таким образом, это тоже сработает

3. Вероятно, плохая идея добавить «(.*)» в конце регулярного выражения для повышения производительности…

Ответ №3:

если средство сопоставления инициализировано с помощью 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());
}
  

Выходной сигнал:

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

Комментарии:

1. matcher.find() требуется перед этим, ИМО.

2. @Nishant вот что я написал: «после совпадения». Добавлен пример кода для иллюстрации

Ответ №4:

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

Ответ №5:

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

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