Введение
Метасимвол ? ограничивает совпадения нулевым или единичным количеством, как и интервалы с фиксированными диапазонами. Однако кванторы *, + и {n,} могут приводить к чрезмерным совпадениям из-за своей жадности.
Проблема жадных совпадений
Рассмотрим текст с HTML-тегами:
Текст:
Данное предложение недоступно для клиентов, проживающих в городах Москва и Хабаровск.
Регулярное выражение:
<[bB]>.*<\/[bB]>
Результат:
Данное предложение недоступно для клиентов, проживающих в городах Москва и Хабаровск. Анализ: Жадный квантор .* захватывает всё от первого <b> до последнего </b>, включая лишние теги.
Ленивые кванторы
Для минимальных совпадений используются ленивые кванторы с добавлением ?. Соответствие:
| Жадный квантор | Ленивый квантор |
|---|---|
* | *? |
+ | +? |
{n,} | {n,}? |
Исправим пример:
Текст:
Данное предложение недоступно для клиентов, проживающих в городах Москва и Хабаровск.
Регулярное выражение:
<[bB]>.*?<\/[bB]>
Результат:
Данное предложение недоступно для клиентов, проживающих в городах Москва и Хабаровск. Анализ: Ленивый *? ограничивает совпадение каждым тегом отдельно.
Совет
Жадные кванторы упрощают шаблоны, но при необходимости заменяйте их ленивыми.
Заключение
Ленивые кванторы предотвращают избыточные совпадения, улучшая точность обработки текста.
Отзывы