Регулярні вирази. Жадібні і ледачі кванторів

328

Від автора: вітаю вас, друзі. У цій статті ми поговоримо про властивості квантификаторов в регулярних виразах, конкретніше — про жадібних і ледачих або нежадібних квантификаторах. Почнемо?

Отже, що ж це за властивості такі — жадібність і нежадність — і як вони позначаються на роботі квантификаторов. Як ми пам’ятаємо з попередньої статті, кванторів визначають кількість повторень символу або групи символів. Найчастіше в роботі використовуються кванторів + і *, які визначають повторення символу від 1 до нескінченності і від 0 до нескінченності відповідно.

При цьому всі кванторів у регулярних виразах за замовчуванням є жадібними, тобто вони будуть намагатися захопити якомога більшу кількість повторень символів. Яскравий приклад жадібності квантификаторов можна спостерігати при пошуку посилань в рядку:

$pattern = ‘# .+ #’;

Регулярні вирази. Жадібні і ледачі кванторів

Що ми бачимо? Регулярний вираз замість пошуку двох посилань знайшла лише один збіг, який включає обидва посилання і весь текст між ними, тобто було захоплено багато зайвого.

Сталося це якраз по причині жадібності квантификаторов. У цій частині шаблону .+ ми вказали, що між відкриваючим і закриваючим тегами посилання може знаходитися будь-який символ. В результаті ця частина регулярки чесно захопила все, починаючи від знака більше першої посилання і закінчуючи знаком менше другий посилання. На скріншоті нижче ця частина виділена фіолетовим кольором:

Регулярні вирази. Жадібні і ледачі кванторів

Як же вирішити цю задачу? Досить просто. Ми повинні змінити властивість жадібності квантификатора, зробивши його нежадібним або ледачим. Робиться це додаванням знака після квантификатора. Тим самим квантіфікатор стає ледачим і буде намагатися захопити якомога меншу кількість символів. Ну що ж, спробуємо зробити квантіфікатор нежадібним:

$pattern = ‘# .+? #’;

Регулярні вирази. Жадібні і ледачі кванторів

Ось тепер регулярка спрацювала так, як ми і планували. Не забувайте про це властивості квантификаторов і ваші регулярні вирази будуть працювати коректно. Також варто відзначити, що в PHP нам доступний модифікатор шаблону U, який робить кванторів за замовчуванням нежадными.

На цьому у мене все. Більше про регулярних виразах ви можете дізнатися з нашого курсу з регулярними виразами. Удачі!