Перейти до основного вмісту
Модуль 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 спроб