Уроки модуля (3/4)
Жадный против ленивого
По умолчанию квантификаторы являются жадными: они потребляют как можно больше
сохраняя при этом шаблон действительным. Добавление ? после квантификатора (*?, +?,
??, {n,m}?) дает вам ленивую версию: она потребляет всего лишь
возможно.
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), механизм потребляет абсолютный минимум и продвигается по одному символу за раз в поисках следующего соответствия шаблону.
Попробуйте это
Извлеките каждый тег HTML из образца (например, `<b>`, `</b>`, `<i>`, `</i>`), используя отложенную версию `.*?`.
Показать подсказку
Жадный <.*> соответствует от начала первого тега до конца последнего. Ленивый <.*?> останавливается на первом встреченном >.
Решение доступно после 3 попыток
Обзор упражнения
Извлеките каждую строку в тексте, заключенную в двойные кавычки (например, «ciao», «mondo»). Используйте ленивую версию квантификатора, чтобы не переходить к более поздним закрытиям.
Показать подсказку
".*?" останавливается на первой закрывающей двойной кавычке.
Решение доступно после 3 попыток
Дополнительная задача
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 попыток