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