Регулярные выражения (Regexp)

Теория: Жадность

В этом уроке мы познакомимся с понятиями жадной и ленивой квантификации.

Давайте напишем регулярное выражение, которое подсветит все теги в нашей строке. Для этого укажем открывающие и закрывающие знаки тега: < и >. Внутри пусть будет любой символ:


/<.*>/

<a href="https://www.yandex.ru">google</a>


В строке есть два тега — открывающий и закрывающий. Несмотря на это, в результате сопоставилась вся строка. Такое поведение называется жадным. Это значит, что квантификатор повторяется столько раз, сколько это возможно. По умолчанию в регулярных выражениях квантификация жадная, поэтому мы захватываем максимальную подстроку. Вся строка соответствует нашему регулярному выражению — все внутри < и > считается содержимым тега.

Попробуем избежать жадного поведения, вместо любого символа внутри тега мы можем задать любой символ, за исключением закрывающего. И тогда сопоставляются два тега отдельно:


/<[^>]*>/

<a href="https://www.yandex.ru">google</a>


Несмотря на эффективность такого решения, это лишь уход от проблемы. Так можно избежать последствий жадного поведения, но не его самого.

В противоположность жадной квантификации существует ленивая. В ленивой мы захватываем минимальную подстроку. Чтобы из жадной квантификации сделать ленивую, нужно использовать специальный символ ?:


/<.*?>/

<a href="https://www.yandex.ru">google</a>


Не забывайте, что в регулярных выражениях многие специальные символы ведут себя по-разному, в зависимости от того, где они стоят. Если бы ? располагался после точки, то он рассматривался бы просто как квантификатор «ни одного символа, либо один символ»:


/<.?>/

<p><a href=" https://yandex.ru ">google</a></p>


При этом когда ? идет сразу после квантификатора, он рассматривается как специальный символ, который из жадных квантификаторов делает ленивые.

Рекомендуемые программы