Как сопоставить первое слово после выражения с регулярным выражением? - PullRequest
18 голосов
/ 13 февраля 2009

Например, в этом тексте:

Lorem Ipsum Dolor Sit Amet, Concetetur Adipiscing Elit Nunc eu Tellus Vel Nunc Pretium Lacinia. Проин сед лорем. Cras sed ipsum. Nunc a libero quis risus sollicitudin imperdiet.

Я хочу найти слово после ipsum.

Ответы [ 5 ]

33 голосов
/ 13 февраля 2009

Это звучит как работа для слепых, хотя вы должны знать, что не все разновидности регулярных выражений поддерживают их. В вашем примере:

(?<=\bipsum\s)(\w+)

Это будет соответствовать любой последовательности буквенных символов, которая следует за «ipsum» как целое слово, за которым следует пробел. не соответствует самому "ipsum", вам не нужно беспокоиться о его повторной установке в случае, например, замена.

Как я уже сказал, некоторые разновидности (например, JavaScript) вообще не поддерживают просмотр назад. Многие другие (большинство на самом деле) поддерживают только вид сзади «фиксированной ширины» - так что вы можете использовать этот пример, но не любой из операторов повторения. (Другими словами, (?<=\b\w+\s+)(\w+) не будет работать .)

4 голосов
/ 13 февраля 2009

Некоторые из других респондентов предложили использовать регулярное выражение, которое не зависит от внешнего вида, но я думаю, что нужен полный, рабочий пример, чтобы понять суть. Идея состоит в том, что вы сопоставляете всю последовательность («ipsum» плюс следующее слово) обычным образом, а затем используете группу захвата, чтобы выделить интересующую вас часть. Например:

String s = "Lorem ipsum dolor sit amet, consectetur " +
    "adipiscing elit. Nunc eu tellus vel nunc pretium " +
    "lacinia. Proin sed lorem. Cras sed ipsum. Nunc " +
    "a libero quis risus sollicitudin imperdiet.";

Pattern p = Pattern.compile("ipsum\\W+(\\w+)");
Matcher m = p.matcher(s);
while (m.find())
{
  System.out.println(m.group(1));
}

Обратите внимание, что это печатает и "dolor" и "Nunc". Чтобы сделать это с версией lookbehind, вам нужно сделать что-то хакерское, например:

Pattern p = Pattern.compile("(?<=ipsum\\W{1,2})(\\w+)");

Это в Java, которая требует, чтобы внешний вид имел очевидную максимальную длину. Некоторые ароматы не обладают такой большой гибкостью, и, конечно, некоторые вообще не поддерживают внешний вид.

Однако самая большая проблема, с которой люди сталкиваются в своих примерах, это не взгляды, а границы слов. Дэвид Кемп и ck, похоже, ожидают, что \b будет соответствовать пробелу после «m», но это не так; это соответствует позиции (или границе) между 'm' и пробелом.

Это распространенная ошибка, которую я даже встречал в нескольких книгах и руководствах, но конструкция границы слова \b никогда не совпадает ни с одним символом. Это утверждение нулевой ширины, например, обходные пути и якоря (^, $, \z и т. Д.), И ему соответствует позиция, которой предшествует символ слова, а не один, или сопровождаемый символом слова и не предшествующий одному.

1 голос
/ 13 февраля 2009

Ipsum \ б (\ ш *)

0 голосов
/ 12 июля 2017

С javascript вы можете использовать (?=ipsum.*?(\w+))

Это также получит второе вхождение (Nunc)

0 голосов
/ 13 февраля 2009

Ipsum \ б (. *) \ Б

EDIT: хотя в зависимости от вашей реализации регулярных выражений, это может быть голодным и найти все слова после ipsum

...