Например, в этом тексте:
Lorem ipsum dolor sit amet, conctetur adipiscing elit. Nunc eu tellus vel nunc pretium lacinia. Proin sed lorem. Cras sed ipsum. Nunc a libero quis risus sollicitudin imperdiet.
Я хочу сопоставить слово после «ipsum».
Например, в этом тексте:
Lorem ipsum dolor sit amet, conctetur adipiscing elit. Nunc eu tellus vel nunc pretium lacinia. Proin sed lorem. Cras sed ipsum. Nunc a libero quis risus sollicitudin imperdiet.
Я хочу сопоставить слово после «ipsum».
Это звучит как работа для ретроспективы, хотя вы должны знать, что не все разновидности регулярных выражений их поддерживают. В вашем примере:
(?<=\bipsum\s)(\w+)
Это будет соответствовать любой последовательности буквенных символов, следующих за «ipsum» как целое слово, за которым следует пробел. Он не соответствует самому "ipsum", вам не нужно беспокоиться о его повторной вставке в случае, например, замены.
Однако, как я уже сказал, некоторые разновидности (например, JavaScript) вообще не поддерживают ретроспективный просмотр. Многие другие (фактически большинство) поддерживают только просмотр назад с фиксированной шириной, поэтому вы можете использовать этот пример, но не любой из операторов повторения. (Другими словами, (?<=\b\w+\s+)(\w+)
не будет работать.)
(?<!A *)(B)
, поскольку ретроспективный просмотр не исправлен. Вместо этого вы можете использовать ^(?>(?>(?>(?>(?!A *B).)*)A *B)*).*?(B)
. Обратите внимание, что это может стать очень неэффективным, если аромат также не поддерживает атомарную группировку или притяжательные квантификаторы ...
- person JonM; 16.10.2013
Некоторые из других респондентов предложили использовать регулярное выражение, которое не зависит от просмотра назад, но я думаю, что для понимания сути необходим полный рабочий пример. Идея состоит в том, что вы сопоставляете всю последовательность («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». Чтобы сделать это с помощью ретроспективной версии, вам нужно будет сделать что-то вроде хакерства:
Pattern p = Pattern.compile("(?<=ipsum\\W{1,2})(\\w+)");
Это в Java, которая требует, чтобы ретроспективный просмотр имел очевидную максимальную длину. Некоторые ароматы не обладают даже такой гибкостью, и, конечно же, некоторые вообще не поддерживают ретроспективный просмотр.
Однако самая большая проблема, с которой люди сталкиваются в своих примерах, связана не с ретроспективой, а с границами слов. И Дэвид Кемп, и ck, кажется, ожидают, что \b
будет соответствовать пробелу, следующему за 'm', но это не так; он соответствует положению (или границе) между буквой m и пробелом.
Это распространенная ошибка, которую я даже видел повторяющейся в нескольких книгах и учебных пособиях, но конструкция границы слова, \b
, никогда не соответствует никаким символам. Это утверждение нулевой ширины, такое как поисковые пути и якоря (^
, $
, \z
и т. Д.), И то, что оно соответствует, - это позиция, которой либо предшествует символ слова и не следует за ним, либо за ней следует символ слова и не предшествует один.
С javascript
вы можете использовать (?=ipsum.*?(\w+))
Это также получит второе вхождение (Nunc)
(?<=\bipsum\s|\bipsum\.\s)(\w+)
/(?<=\bipsum\s|\bipsum\.\s)(\w+)/gm
Положительный просмотр назад (?<=\bipsum\s|\bipsum\.\s)
Подтвердите, что регулярное выражение ниже соответствует
\bipsum\s
\ b утверждает позицию на границе слова: (^\w|\w$|\W\w|\w\W)
ipsum буквально соответствует символам ipsum (с учетом регистра) \ s соответствует любому пробельному символу (равному [\r\n\t\f\v ]
)\bipsum\.\s
\ b утверждает позицию на границе слова: (^\w|\w$|\W\w|\w\W)
ipsum буквально соответствует символам ipsum (с учетом регистра). соответствует персонажу. буквально (с учетом регистра) \ s соответствует любому символу пробела (равному [\r\n\t\f\v ]
) 1-я группа захвата (\ w +) \ w + соответствует любому символу слова (равному [a-zA-Z0-9_]
)ipsum \ b (. *) \ b
РЕДАКТИРОВАТЬ: хотя в зависимости от вашей реализации регулярного выражения это может быть голодным и найти все слова после ipsum