it-swarm-ru.tech

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

Я новичок в использовании 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");
}
55
Scott

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

(?<=sentence).*

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

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

85
Tim Pietzcker

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

16
st.never

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

Результат:

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

8
Sean Patrick Floyd

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

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

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

1
Rami C