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

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

компания ipsum боль сидеть Амет, consectetur проектами работающих вы где элит. Nunc eu tellus vel nunc pretium lacinia. Проин сед Лорем. Крас сед Ипсум. Nunc a libero quis risus sollicitudin imperdiet.

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

5 ответов


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

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

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

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


некоторые из других респондентов предложили использовать регулярное выражение, которое не зависит от 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", но это не так; это соответствует позиции (или границе) между "м" и пространство.

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


ipsum\b (\w*)


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

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


ipsum\b(.* ) \b

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