В первой статье мы прошлись по базовым вещам из которых составляются регулярные выражения и теперь можем перейти к более сложным и интересным вещам.
Опережающая проверка
X(?=Y) - грубо говоря, найди X за которым стоит Y.
X и Y могут быть как чем-то конкретным, так и другими регулярными выражениями. Рассмотрим пример! У нас есть список почтовых адресов:
- qwe@mail.ru
- qwer@yandex.ru
- qwert@gmail.com
- asd@mail.ru
- asdf@yandex.ru
- asdfg@gmail.com
Хотим получить часть строки до @, и окончанием .ru
.+ - часть которая нам нужна, остальное это опережающая проверка, которая проверяет, что мы работаем с почтовым адресом (наличие @) и он оканчивается на .ru
Ретроспективная проверка
В общем-то, это то же самое, но в другую сторону: (?<=Y)X - находит X перед которым стоит Y.
К сожалению, параметры поиска должны быть точными - вы должны знать длину строки перед X. Ретреспективная проверка не поддерживает выражения без фиксированной длины:
Отрицание
Для вышеописанных проверок существуют "отрицающие" варианты:
- X(?!Y) - негативная опережающая проверка - ищет X за которым нет Y;
- (?<!Y)X - негативная ретроспективная проверка - ищет X, перед которым нет Y.
Заключение
Безусловно, данные проверки можно заменить базовыми конструкциями, однако они бывают удобны при решении нетривиальных задач, где требуется поиск в определенных последовательностях (например разбор исходных текстов ПО, кода страниц и др.).