Для сохранения прогресса вступите в курс. Войти или зарегистрироваться.

Конспект урока

Большинство реализаций регулярных выражений поддерживают функцию просмотра вперёд и назад или опережающий и ретроспективный поиск (англ. — lookahead, lookbehind). Давайте посмотрим, зачем они нужны.

У нас есть следующее регулярное выражение, которое находит две подстроки:


/LudovicXVI

LudovicXV, LudovicXVI, LudovicXVIII, LudovicLXVII, LudovicXXL


Предположим, что нам не нужно включать в результаты поиска часть подстроки с римскими цифрами XVI. Для этого "обернём" её вот в такую конструкцию:


/Ludovic(?=XVI)

LudovicXV, LudovicXVI, LudovicXVIII, LudovicLXVII, LudovicXXL


Как мы видим, условия сопоставления, заданные первоначальным выражением, не изменились. Сопоставились те же подстроки, что и в предыдущем примере. Однако символы XVI в совпавших подстроках не были включены в окончательный результат поиска. Такое поведение называется позитивным просмотром вперёд или позитивным опережающим поиском.

Логику позитивного просмотра вперёд можно описать следующим образом. Регулярное выражение a(?=b) находит совпадения таких a, за которыми следует b, не делая b частью сопоставления.

Просмотр вперёд также может быть негативным - тогда он будет искать совпадения в тех подстроках, где указанная в скобках часть подстроки отсутствует. В нашем случае - это по-прежнему XVI. Чтобы из позитивного просмотра сделать негативный, заменим символ = на !. Теперь у нас сопоставились три другие подстроки:


/Ludovic(?!XVI)

LudovicXV, LudovicXVI, LudovicXVIII, LudovicLXVII, LudovicXXL


Кроме просмотра вперёд, существует просмотр назад или ретроспективный поиск. Он работает похожим образом, но ищет совпадения символов, расположенных после сгруппированной в скобках части регулярного выражения, которая не будет включена в сопоставление.

Иными словами, при позитивном просмотре назад регулярное выражение (?<=b)a находит совпадения таких a, перед которыми следует b, не делая b частью сопоставления.

Для позитивного просмотра назад используется дополнительный знак <. В этом примере мы находим совпадения подстрок Two, перед которыми следует One:


/(?<=One )Two

One Two, Free Two


Чтобы изменить позитивный просмотр назад на негативный, точно так же, как и в просмотре вперёд, меняем = на !:


/(?<!One )Two

One Two, Free Two


Мы учим программированию с нуля до стажировки и работы. Попробуйте наш бесплатный курс «Введение в программирование» или полные программы обучения по Node, PHP, Python и Java.

Хекслет

Подробнее о том, почему наше обучение работает →