В этом уроке мы изучим еще одну технику поиска — поиск по условию. Это одна из самых сложных конструкций, которая существует в регулярных выражениях и не поддерживается в JavaScript, и многих других языках программирования.
В некоторых языках нужно учитывать особенности его реализации: Python поддерживает условный поиск с использованием группировки с обратной связью или именованных групп.
Эта конструкция напоминает тернарный оператор из языков программирования и выглядит следующим образом: (?ifthen|else)
.
Рассмотрим ее работу на таком примере:
/(?(?<=a)m|p)
/
mam
,p
ap
Мы видим внешние скобки с ?
, а внутри — два отдельных выражения:
- Первое — это условие
(?<=a)
. Оно проверяет, соответствует ли символ слеваa
- Дальше идет альтернатива. Мы выбираем между
m
иp
в зависимости от того, сработало условие или нет
Можно описать эту конструкцию так: «Найти все m
перед которыми идет a
, или все p
, перед которыми a
нет».
Давайте разберем поиск в нашей строке посимвольно:
- Сначала идет проверка условия — является ли текущий символ
m
и стоит ли перед нимa
. Условие не выполнилось, поэтому пробуем извлечьp
, что также не является текущим символом - Второй символ
a
не подходит под условия. Пропускаем подстрокуma
и проверяемm,pap
- Третий символ
m
соответствуетm
, ранее былаa
— мы нашли первое сопоставление - Четвертый символ
,
не подходит под условия. Пропускаем подстрокуmam,
и проверяемpap
- Пятый символ
p
не соответствуетam
, но соответствуетp
— мы нашли второе сопоставление - Шестой символ
a
снова запускает проверку следующего символа на соответствиеm
- Седьмой символ
p
проваливает проверку на соответствиеm
Вот так в результате условного поиска мы нашли два совпадения в строке.
Дополнительные материалы
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.