#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());