Модульні уроки (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 спроб