Від автора: вітаю вас, друзі. У цій статті ми поговоримо про властивості квантификаторов в регулярних виразах, конкретніше — про жадібних і ледачих або нежадібних квантификаторах. Почнемо?
Отже, що ж це за властивості такі — жадібність і нежадність — і як вони позначаються на роботі квантификаторов. Як ми пам’ятаємо з попередньої статті, кванторів визначають кількість повторень символу або групи символів. Найчастіше в роботі використовуються кванторів + і *, які визначають повторення символу від 1 до нескінченності і від 0 до нескінченності відповідно.
При цьому всі кванторів у регулярних виразах за замовчуванням є жадібними, тобто вони будуть намагатися захопити якомога більшу кількість повторень символів. Яскравий приклад жадібності квантификаторов можна спостерігати при пошуку посилань в рядку:
$pattern = ‘# .+ #’;
Що ми бачимо? Регулярний вираз замість пошуку двох посилань знайшла лише один збіг, який включає обидва посилання і весь текст між ними, тобто було захоплено багато зайвого.
Сталося це якраз по причині жадібності квантификаторов. У цій частині шаблону .+ ми вказали, що між відкриваючим і закриваючим тегами посилання може знаходитися будь-який символ. В результаті ця частина регулярки чесно захопила все, починаючи від знака більше першої посилання і закінчуючи знаком менше другий посилання. На скріншоті нижче ця частина виділена фіолетовим кольором:
Як же вирішити цю задачу? Досить просто. Ми повинні змінити властивість жадібності квантификатора, зробивши його нежадібним або ледачим. Робиться це додаванням знака після квантификатора. Тим самим квантіфікатор стає ледачим і буде намагатися захопити якомога меншу кількість символів. Ну що ж, спробуємо зробити квантіфікатор нежадібним:
$pattern = ‘# .+? #’;
Ось тепер регулярка спрацювала так, як ми і планували. Не забувайте про це властивості квантификаторов і ваші регулярні вирази будуть працювати коректно. Також варто відзначити, що в PHP нам доступний модифікатор шаблону U, який робить кванторів за замовчуванням нежадными.
На цьому у мене все. Більше про регулярних виразах ви можете дізнатися з нашого курсу з регулярними виразами. Удачі!