Как совместить первое слово после выражения с регулярным выражением?

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

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.

Я хочу совместить слово после "ipsum".

Ответы

Ответ 1

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

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

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

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

Ответ 2

Некоторые из других респондентов предложили использовать регулярное выражение, которое не зависит от lookbehinds, но я думаю, что полный рабочий пример необходим, чтобы получить смысл. Идея состоит в том, что вы соответствуете всей последовательности ( "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, для чего требуется, чтобы lookbehind имел максимальную максимальную длину. Некоторые вкусы не имеют даже такой гибкости, и, конечно же, некоторые из них не поддерживают lookbehinds вообще.

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

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

Ответ 3

Ipsum\Ъ (\ ш *)

Ответ 4

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

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

Ответ 5

Ipsum\Ь (. *)\Б

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