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

Некоторые другие респонденты lookbehind предложили использовать регулярное perl-regex выражение, не зависящее от perl-regex ретроспективного просмотра, но lookbehind я думаю, что для понимания regex сути необходим полный рабочий apache-regexp пример. Идея состоит в том, что regex-php вы сопоставляете всю последовательность regularexpression («ipsum» плюс следующее слово) обычным regex-php способом, а затем используете lookbehind группу захвата, чтобы изолировать regular-expression интересующую вас часть. Например:

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));
}

Обратите regularexpression внимание, что при этом печатаются lookbehind как «dolor», так и «Nunc». Чтобы regex-php сделать это с помощью ретроспективной regular-expressions версии, вам нужно будет сделать word-boundary что-то вроде хакерства:

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

Это regex в Java, где требуется, чтобы regularexpression ретроспективный просмотр regex имел очевидную максимальную regexes длину. Некоторые варианты apache-regexp не обладают даже такой гибкостью, и, конечно regex же, некоторые вообще не поддерживают regular-expressions ретроспективный просмотр.

Однако regex-php самая большая проблема, с regexes которой люди сталкиваются regex в своих примерах, связана perlre не с ретроспективой, а с regularexpression границами слов. И Дэвид Кемп, и regexp ck, похоже, ожидают, что perl-regex \b будет соответствовать пробелу, следующему regular-expression за «m», но это не так; он regex-php соответствует положению (или lookbehind границе) между буквой m и пробелом.

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

regex

lookbehind

word-boundary

2022-11-05T00:59:16+00:00
Вопросы с похожей тематикой, как у вопроса:

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