В этом уроке мы познакомимся с понятиями жадной и ленивой квантификации.
Давайте напишем регулярное выражение, которое подсветит все теги в нашей строке. Для этого укажем открывающие и закрывающие знаки тега: <
и >
. Внутри пусть будет любой символ:
/<.*>
/
<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>
При этом когда ?
идет сразу после квантификатора, он рассматривается как специальный символ, который из жадных квантификаторов делает ленивые.
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.