Сверхжадние або ревниві квантіфікатори в регулярних виразах

Сверхжадние або ревниві квантіфікатори в регулярних виразах

Ми з Вами вже розглядали звичайні квантіфікатори повторень, а також розібрали ледачі квантіфікатори. І настав час розглянути ще одну групу - це сверхжадние або ревниві квантіфікатори повторень.

особливість сверхжадних квантіфікаторов в тому, що вони поводяться як жадібні, тобто захоплюють, як можна більшу частину рядка, але ще й не віддають її назад. Тобто вони не дають на перевірку схоплену частина інших частин регулярного виразу.

Для кращого розуміння давайте розберемо приклад:

lt ;?php
preg_match
(`/".*"/i`,`A "b" c "d"`, $ matches) -
print_r
($ matches) -
?gt;



Чи не для кого не буде сюрпризом, що відповідність буде виявлено і цей рядок: "B" c "d". Це звичайний жадібний квантіфікатор, який взяв якомога більшу частину рядка, а потім віддав назад. Власне, завдяки цьому "відкату", Відповідність і було виявлено.

Відео: Java RegEx. Урок 7. Ревнива (сверхжадная) квантификация




Тепер же поставимо свержадний квантіфікатор (.* + - додали знак "+"):

lt ;?php
preg_match
(`/".*+"/i`,`A "b" c "d"`, $ matches) -
print_r
($ matches) -
?gt;

Відповідності взагалі не буде, оскільки сверхжадний квантіфікатор після того, як дістався до останньої лапки (ознака "жадібності"), Що не відкотився назад (ознака"сверхжадності").

Скажу чесно, в своїй практиці я не знайшов жодного варіанту використання даного типу квантіфікатора. Всі приклади, які я бачив в Інтернеті були на зразок: "з Москви до Ленінграда через Владивосток". Вони все легко обійшлися б без свержадних квантіфікаторов. Однак, єдина користь від них, яку я міг би припустити - це відмінна продуктивність. Давайте я наведу приклад, де це може бути використано. Припустимо, у нас є рядок: "aaa". Ми хочемо зробити так, щоб регулярний вираз спрацьовувало, якщо є на кінці"b". Зрозуміло, рядок"aaa"Ніколи не буде відповідати такій вимозі:

lt ;?php
echo preg_match
(`/ A + b / i`,`Aaa`) -
echo preg_match
(`/ A ++ b / i`,`Aaa`) -
?gt;

У першому випадку ми використовували звичайний жадібний квантіфікатор, у другому випадку сверхжадний. Результатом обох регулярних виразів став 0. Однак! Друге регулярний вираз (там, де сверхжадний) Спрацював значно швидше. Таким чином, сверхжадние квантіфікатори можна використовувати для швидкого відсіву свідомо невідповідних рядків.

Поділися в соціальних мережах:

Схожі
Функції форматного виведення в phpФункції форматного виведення в php
Регулярні виразиРегулярні вирази
Визначення мови користувача на phpВизначення мови користувача на php
Chcp - перегляд або зміна кодової сторінки в командному рядку windows.Chcp - перегляд або зміна кодової сторінки в командному рядку windows.
Модифікатори в регулярних виразахМодифікатори в регулярних виразах
Відправлення запитів до бази даних в phpВідправлення запитів до бази даних в php
Як дізнатися країну по ip-адресою через phpЯк дізнатися країну по ip-адресою через php
Регулярні вирази linuxРегулярні вирази linux
Функції для роботи з регулярними виразами в phpФункції для роботи з регулярними виразами в php
Російська мова та регулярні вирази в phpРосійська мова та регулярні вирази в php
» » Сверхжадние або ревниві квантіфікатори в регулярних виразах