Большинство реализаций регулярных выражений поддерживают функцию просмотра вперёд и назад или опережающий и ретроспективный поиск (англ. — lookahead, lookbehind). Давайте посмотрим, зачем они нужны.
У нас есть следующее регулярное выражение, которое находит две подстроки:
/LudovicXVI
/
LudovicXV, LudovicXVI
, LudovicXVI
II, LudovicLXVII, LudovicXXL
Предположим, что нам не нужно включать в результаты поиска часть подстроки с римскими цифрами XVI
. Для этого "обернём" её вот в такую конструкцию:
/Ludovic(?=XVI)
/
LudovicXV, Ludovic
XVI, Ludovic
XVIII, LudovicLXVII, LudovicXXL
Как мы видим, условия сопоставления, заданные первоначальным выражением, не изменились. Сопоставились те же подстроки, что и в предыдущем примере. Однако символы XVI
в совпавших подстроках не были включены в окончательный результат поиска. Такое поведение называется позитивным просмотром вперёд или позитивным опережающим поиском.
Логику позитивного просмотра вперёд можно описать следующим образом. Регулярное выражение a(?=b)
находит совпадения таких a
, за которыми следует b
, не делая b
частью сопоставления.
Просмотр вперёд также может быть негативным - тогда он будет искать совпадения в тех подстроках, где указанная в скобках часть подстроки отсутствует. В нашем случае - это по-прежнему XVI
. Чтобы из позитивного просмотра сделать негативный, заменим символ =
на !
. Теперь у нас сопоставились три другие подстроки:
/Ludovic(?!XVI)
/
Ludovic
XV, LudovicXVI, LudovicXVIII, Ludovic
LXVII, Ludovic
XXL
Кроме просмотра вперёд, существует просмотр назад или ретроспективный поиск. Он работает похожим образом, но ищет совпадения символов, расположенных после сгруппированной в скобках части регулярного выражения, которая не будет включена в сопоставление.
Иными словами, при позитивном просмотре назад регулярное выражение (?<=b)a
находит совпадения таких a
, перед которыми находится b
, не делая b
частью сопоставления.
Для позитивного просмотра назад используется дополнительный знак <
. В этом примере мы находим совпадения подстрок Two
, перед которыми следует One
:
/(?<=One )Two
/
One Two
, Three Two
Чтобы изменить позитивный просмотр назад на негативный, точно так же, как и в просмотре вперёд, меняем =
на !
:
/(?<!One )Two
/
One Two, Three Two
Вам ответят команда поддержки Хекслета или другие студенты.
Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.
Загляните в раздел «Обсуждение»:
Статья «Ловушки обучения»
Вебинар «Как самостоятельно учиться»
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.
Наши выпускники работают в компаниях:
С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.
Зарегистрируйтесь или войдите в свой аккаунт