В этом уроке мы изучим еще одну технику поиска — поиск по условию. Это одна из самых сложных конструкций, которая существует в регулярных выражениях и не поддерживается в JavaScript, и многих других языках программирования.
В некоторых языках нужно учитывать особенности его реализации: Python поддерживает условный поиск с использованием группировки с обратной связью или именованных групп.
Эта конструкция напоминает тернарный оператор из языков программирования и выглядит следующим образом: (?ifthen|else).
Рассмотрим ее работу на таком примере:
/(?(?<=a)m|p)/
mam,pap
Мы видим внешние скобки с ?, а внутри — два отдельных выражения:
- Первое — это условие 
(?<=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 
Вот так в результате условного поиска мы нашли два совпадения в строке.
Дополнительные материалы
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.