Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Просмотр вперед/назад Регулярные выражения

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

Большинство реализаций регулярных выражений поддерживают функцию просмотра вперёд и назад или опережающий и ретроспективный поиск (англ. — 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, Three Two


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


/(?<!One )Two/

One Two, Three Two



Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты.

Ошибки, сложный материал, вопросы >
Нашли опечатку или неточность?

Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.

Что-то не получается или материал кажется сложным?

Загляните в раздел «Обсуждение»:

  • задайте вопрос. Вы быстрее справитесь с трудностями и прокачаете навык постановки правильных вопросов, что пригодится и в учёбе, и в работе программистом;
  • расскажите о своих впечатлениях. Если курс слишком сложный, подробный отзыв поможет нам сделать его лучше;
  • изучите вопросы других учеников и ответы на них. Это база знаний, которой можно и нужно пользоваться.
Об обучении на Хекслете

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
900
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.

  • 120 курсов, 2000+ часов теории
  • 900 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы соглашаетесь c «Политикой конфиденциальности» и «Условиями оказания услуг»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы

С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.

Иконка программы Фронтенд-разработчик
Профессия
Разработка фронтенд-компонентов веб-приложений
8 декабря 8 месяцев
Иконка программы Python-разработчик
Профессия
Разработка веб-приложений на Django
8 декабря 8 месяцев
Иконка программы PHP-разработчик
Профессия
Разработка веб-приложений на Laravel
8 декабря 8 месяцев
Иконка программы Node.js-разработчик
Профессия
Разработка бэкенд-компонентов веб-приложений
8 декабря 8 месяцев

Используйте Хекслет по максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы соглашаетесь c «Политикой конфиденциальности» и «Условиями оказания услуг»