Получение текста, который следует после соответствия регулярному выражению - PullRequest
55 голосов
/ 15 февраля 2011

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

Ответы [ 5 ]

88 голосов
/ 15 февраля 2011

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

(?<=sentence).*

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

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

16 голосов
/ 15 февраля 2011

Ваше регулярное выражение "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 голосов
/ 15 февраля 2011

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

Выход:

это круто

1 голос
/ 17 мая 2012

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

System.out.println("I found the text: " + matcher.group(**1**).toString());
1 голос
/ 15 февраля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...