Regular Expressions
Lookahead и Lookbehind
Поиск…
Синтаксис
- Положительный взгляд:
(?=pattern) - Отрицательный взгляд:
(?!pattern) - Положительный lookbehind :
(?<=pattern) - Отрицательный lookbehind :
(?<!pattern)
замечания
Не поддерживается всеми двигателями регулярных выражений.
Кроме того, многие механизмы регулярных выражений ограничивают шаблоны внутри lookbehinds строками фиксированной длины. Например, шаблон (?<=a+)b aaab (?<=a+)b должен соответствовать b в aaab но вызывает ошибку в Python.
Захватывающие группы разрешены и работают так, как ожидалось, включая обратные ссылки. Однако сам lookahead / lookbehind не является группой захвата.
основы
Положительный lookahead (?=123) утверждает, что за текстом следует данный шаблон, без включения шаблона в совпадение. Аналогично, положительный lookbehind (?<=123) утверждает, что этому тексту предшествует данный шаблон. Заменив = с ! отрицает утверждение.
Вход : 123456
-
123(?=456)соответствует123( положительный результат ) -
(?<=123)456совпадений456( положительный lookbehind ) -
123(?!456)не работает ( отрицательный результат ) -
(?<!123)456терпит неудачу ( отрицательный lookbehind )
Вход : 456
-
123(?=456)не работает -
(?<=123)456не удается -
123(?!456)не работает -
(?<!123)456совпадений456
Использование lookbehind для тестирования окончаний
В конце шаблона можно использовать lookbehind, чтобы обеспечить его окончание или нет.
([az ]+|[AZ ]+)(?<! ) соответствует последовательностям только строчных или только прописных слов, исключая конечные пробелы.
Имитация с переменной длиной lookbehind с \ K
Некоторые ароматы регулярных выражений (Perl, PCRE, Oniguruma, Boost) поддерживают только lookbehind с фиксированной длиной, но предлагают функцию \K , которая может использоваться для имитации зависания переменной длины в начале шаблона. При столкновении с \K согласованный текст до этой точки отбрасывается, и только текст, соответствующий части шаблона, следующей за \K , сохраняется в конечном результате.
ab+\Kc
Эквивалентно:
(?<=ab+)c
В общем, шаблон вида:
(subpattern A)\K(subpattern B)
Концы заканчиваются похожими на:
(?<=subpattern A)(subpattern B)
За исключением случаев, когда подшаблон B может совпадать с тем же текстом, что и подзаголовок A, вы можете получить незначительно разные результаты, потому что подшаблон A все еще потребляет текст, в отличие от истинного lookbehind.