Регулярные выражения. Жадные и ленивые квантификаторы

Регулярные выражения. Жадные и ленивые квантификаторы

От автора: приветствую вас, друзья. В этой статье мы поговорим о свойствах квантификаторов в регулярных выражениях, конкретнее — о жадных и ленивых или нежадных квантификаторах. Начнем?

Итак, что же это за свойства такие — жадность и нежадность — и как они отражаются на работе квантификаторов. Как мы помним из предыдущей статьи, квантификаторы определяют количество повторений символа или группы символов. Чаще всего в работе используются квантификаторы + и *, которые определяют повторение символа от 1 до бесконечности и от 0 до бесконечности соответственно.

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

$pattern = '# <a href="[^"]+">.+</a> #';

Что мы видим? Регулярное выражение вместо поиска двух ссылок нашло только одно совпадение, которое включает обе ссылки и весь текст между ними, то есть было захвачено много лишнего.

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

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

$pattern = '# <a href="[^"]+">.+?</a> #';

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

На этом у меня сегодня все. Больше о регулярных выражениях вы можете узнать из нашего курса по регулярным выражениям. Удачи!

Хотите изучить регулярные выражения на PHP?

Прямо сейчас посмотрите 12-ти часовой курс по регулярным выражениям на PHP!

Смотреть курс

Метки:

Комментарии Вконтакте:

Комментарии Facebook:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Я не робот.

Spam Protection by WP-SpamFree