Я новичок в использовании 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
?System.out.println("I found the text: " + "some lame sentance that is aweomse".substring(end()));
Ответы:
Вы можете сделать это с помощью «только регулярного выражения», как вы просили в комментарии:
(?<=sentence)
является утверждением с положительным взглядом назад . Это соответствует определенной позиции в строке, а именно позиции сразу после текста,sentence
не делая сам текст частью совпадения. Следовательно,(?<=sentence).*
будет соответствовать любому тексту послеsentence
.Это довольно приятная особенность регулярного выражения. Однако в Java это будет работать только для подвыражений конечной длины, то
(?<=sentence|word|(foo){1,4})
есть допустимо, но(?<=sentence\s*)
не так.источник
.*
соответствует любому тексту, а затем(?<=...)
ищет слово в обратном направленииsentence
, утверждая в этом случае, что совпадение заканчивается этим словом. Если вы хотите остановиться перед этим словом, вам нужно смотреть вперед :.*(?=sentence)
будет соответствовать любому тексту, за которым следуетsentence
.Ваше регулярное выражение
"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(.*)"
)источник
если Matcher инициализирован с помощью
str
, после совпадения вы можете получить деталь после совпадения с помощьюОбразец кода:
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()
требуется перед этим, ИМО.Вам нужно использовать группу (int) вашего сопоставителя - группа (0) - это полное совпадение, а группа (1) - это первая группа, которую вы отметили. В указанном вами примере группа (1) - это то, что следует после слова « предложение ».
источник
Вам просто нужно поместить «group (1)» вместо «group ()» в следующую строку, и результат будет таким, как вы ожидали:
System.out.println("I found the text: " + matcher.group(**1**).toString());
источник