Перейти к основному содержимому
Модуль 2 · Урок 3 из 47/32 в курсе~10 min
Уроки модуля (3/4)

Жадный против ленивого

По умолчанию квантификаторы являются жадными: они потребляют как можно больше сохраняя при этом шаблон действительным. Добавление ? после квантификатора (*?, +?, ??, {n,m}?) дает вам ленивую версию: она потребляет всего лишь возможно.

Code
Sample: <b>uno</b> e <i>due</i>

Greedy pattern  <.*>     matches:  <b>uno</b> e <i>due</i>   (everything)
Lazy pattern    <.*?>    matches:  <b>           </b>
                                   <i>           </i>        (4 matches with the g flag)

Тот же шаблон, разница в один символ (? добавлен в квантор), совершенно разные результаты.

Когда это важно

– Чтобы извлечь содержимое между разделителями (HTML-теги, кавычки, скобки) ленивая версия почти всегда правильная.

  • Для сопоставления до конца строки обычно требуется жадный режим (.*).

Жадные и ленивые стратегии в движке

Жадный квантификатор потребляет как можно больше текста и возвращается назад только в случае необходимости. Добавляя ? (lazy), механизм потребляет абсолютный минимум и продвигается по одному символу за раз в поисках следующего соответствия шаблону.

Попробуйте это

Упражнение#regex.m2.l3.e1
Попыток: 0Загрузка…

Извлеките каждый тег HTML из образца (например, `<b>`, `</b>`, `<i>`, `</i>`), используя отложенную версию `.*?`.

Загрузка редактора…
Показать подсказку

Жадный <.*> соответствует от начала первого тега до конца последнего. Ленивый <.*?> останавливается на первом встреченном >.

Решение доступно после 3 попыток

Обзор упражнения

Упражнение#regex.m2.l3.e2
Попыток: 0Загрузка…

Извлеките каждую строку в тексте, заключенную в двойные кавычки (например, «ciao», «mondo»). Используйте ленивую версию квантификатора, чтобы не переходить к более поздним закрытиям.

Загрузка редактора…
Показать подсказку

".*?" останавливается на первой закрывающей двойной кавычке.

Решение доступно после 3 попыток

Дополнительная задача

Упражнение#regex.m2.l3.e3
Попыток: 0Загрузка…

Extract all text blocks enclosed in square brackets (e.g. `[text]`), including the brackets, using a lazy quantifier so as not to merge separate blocks.

Загрузка редактора…
Показать подсказку

Используйте \\[ для открывающей скобки, затем .*? и, наконец, \\] для закрытой скобки.

Решение доступно после 3 попыток