Поиск…


Синтаксис

  • Положительный взгляд: (?=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.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow