Отримання тексту, що випливає після відповідності регулярного виразу


85

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

Я хочу щось шукати, але повертати все, що слідує за ним, але не сам рядок пошуку

напр. " Якесь кульгаве речення, яке є чудовим "

шукати " речення "

повернути " це чудово "

Будь-яка допомога буде дуже вдячна

Наразі це мій регулярний вираз

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()));
Нішант

3
@DavidIsNotHere Нацист повинен мати столицю N ...
Lee Taylor

Відповіді:


136

Ви можете зробити це за допомогою "просто регулярного виразу", як ви просили в коментарі:

(?<=sentence).*

(?<=sentence)- це позитивний погляд на твердження . Це збігається на певній позиції в рядку, а саме на позиції відразу після тексту, sentenceне роблячи цей текст частиною відповідності. Отже, (?<=sentence).*буде відповідати будь-якому тексту після sentence.

Це досить приємна особливість регулярного виразу. Однак у Java це буде працювати лише для підвиразів кінцевої довжини, тобто (?<=sentence|word|(foo){1,4})є законним, але (?<=sentence\s*)ні.


Ви заявляєте, що воно не повинно включати позитивний погляд на твердження. Тому я припускаю, що ". * (? <= Речення)" має повертати все до, але не включаючи "речення". Але ні, це також повертає "речення". Чого мені не вистачає?
JJJones_3860

@ user2184214: Це тому, що це погляд позаду твердження. .*відповідає будь-якому тексту, а потім (?<=...)шукає слово назад sentence, стверджуючи в цьому випадку, що збіг закінчується цим словом. Якщо ви хочете зупинитися перед цим словом, вам слід заглянути вперед : .*(?=sentence)відповідатиме будь-якому тексту, за яким слідує sentence.
Тім Пітцкер,

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(.*)")


Дякую, але що, якщо я просто хочу, щоб він повернувся "це чудово"
Скотт

Дякую, чудово, це спрацювало чудово, я сподівався, що є спосіб зробити це за допомогою регулярного виразу, якщо я не знайду способу зробити це таким чином, це спрацює також
Скотт

Можливо, погана ідея додати "(. *)" В кінці регулярного виразу для вистави ...
eregon

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()перед цим потрібно IMO.
Нішант

@Nishant ось що я написав: "після матчу". Доданий зразок коду для ілюстрації
Шон Патрік Флойд

1

Вам потрібно використовувати групу (int) вашого матчу - група (0) - це весь матч, а група (1) - перша група, яку ви позначили. У прикладі, який ви вказали, група (1) - це те, що йде після " речення ".


1

Вам просто потрібно поставити "group (1)" замість "group ()" у наступному рядку, і повернення буде таким, як ви очікували:

System.out.println("I found the text: " + matcher.group(**1**).toString());
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.