Регулярний виразВ програмуванні, регулярний вираз (від англ. regular expression, скорочено regex або regexp, а іноді ще й називають rational expression)[1][2] — це рядок, що описує або збігається з множиною рядків, відповідно до набору спеціальних синтаксичних правил. Вони використовуються в багатьох текстових редакторах та допоміжних інструментах для пошуку та зміни тексту на основі заданих шаблонів. Багато мов програмування підтримують регулярні вирази для роботи з рядками. Наприклад, Perl та Tcl мають потужний механізм для роботи, вбудований безпосередньо в їхній синтаксис. Завдяки набору утиліт (разом з редактором sed та фільтром grep), що входили до складу дистрибутивів UNIX, регулярні вирази стали відомими та поширеними. Базові принципиРегулярні вирази базуються на теорії автоматів та теорії формальних мов. Ці розділи теоретичної кібернетики займаються дослідженням моделей обчислення (автомати) та способами описання та класифікації формальних мов. Регулярний вираз (часто називається шаблон) є послідовністю, що описує множину рядків. Ці послідовності використовують для точного описання множини без переліку всіх її елементів. Наприклад, множина, що складається із слів «грати» та «ґрати», може бути описана регулярним виразом «[гґ]рати». В більшості формалізмів, якщо існує регулярний вираз, що описує задану множину, тоді існує нескінченна кількість варіантів, які описують цю множину[джерело?]. СинтаксисСинтаксис регулярних виразів залежить від інтерпретатора, що використовується для їхньої обробки. Однак, із незначними відхиленнями, майже всі поширені інтерпретатори регулярних виразів мають спільні правила. Представлення символівЗвичайні символи (літерали) і спеціальні символи (метасимволи)Найпростішим регулярним виразом, з якого формуються складні, є звичайний символ. Більшість символів у регулярному виразі представляють самі себе, за винятком спеціальних символів (метасимволів)
Аналогічно можуть бути представлені інші спеціальні символи (набір символів, що вимагають екранування, може відрізнятися залежно від конкретної реалізації).
Частина символів, які в тій або іншій реалізації не вимагають екранування (наприклад, кутові дужки Залежно від інтерпретатора регулярних виразів, метасимволи «?», «+», «{», «|», «(», та «)» можуть втрачати своє спеціальне значення, замість цього слід вживати «\?», «\+», «\{», «\|», «\(», та «\)». Будь-який символМетасимволу Символьні класи (набори символів)Набір символів у квадратних дужках Зокрема, Для включення усіх символів українського алфавіту можна використовувати Якщо потрібно вказати символи, які не входять у зазначений набір, то використовують символ Додавання в набір спеціальних символів шляхом екранування символом «\» — найпростіший спосіб. Однак сучасні регулярні вирази успадковують також і традиційний підхід — див. Традиційні регулярні вирази. Деякі символьні класи можна замінити спеціальними метасимволами:
Позиція всередині рядкаНаступні символи дозволяють позиціонувати регулярний вираз щодо елементів тексту: початку й кінця рядка, меж слова.
Квантифікація (пошук послідовностей)Квантифікатор після символу, символьного класу або групи визначає, скільки разів попередній вираз може зустрічатися. Варто враховувати, що квантифікатор може стосуватися більш ніж до одного символу в регулярному виразі, тільки якщо це символьний клас або група.
Часто використовується послідовність Символьні класи в поєднанні із квантифікаторами дозволяють установлювати відповідності з реальними текстами. Наприклад, колонками цифр, телефонами, поштовими адресами, елементами HTML-розмітки й ін. Якщо символи
Жадібна й ледача квантифікаціяПриклад використання жадібних і ледачих виразів
Вираз
Щоб виділити окремі теги, можна застосувати ледачу версію цього виразу:
У деяких реалізаціях квантифікаторам у регулярних виразах відповідає максимально довгий рядок із можливих (квантифікатори є жадібними, англ. greedy).
Це може стати значною проблемою.
Наприклад, часто очікують, що вираз
Цю проблему можна вирішити двома способами.
Використання ледачих квантифікаторів може викликати зворотну проблему, коли виразу відповідає занадто короткий, зокрема, порожній рядок.
Також спільною проблемою як жадібних, так і ледачих виразів є точки повернення для перебору варіантів виразу. Точки ставляться після кожної ітерації квантифікатора. Якщо інтерпретатор не знайшов відповідності після квантифікатора, то він починає повертатися за всіма встановленими точками, перераховуючи звідти вираз по-іншому. Ревнива квантифікація (Найжадібніша)При пошуку виразу
При використанні ревнивого квантифікатора буде виконаний тільки перший крок алгоритму. На відміну від звичайної (жадібної) квантифікації, ревнива квантифікація не тільки намагається знайти максимально довгий варіант, але ще й не дозволяє алгоритму вертатися до попередніх кроків пошуку для того, щоб знайти можливі відповідності для частини регулярного виразу, що залишилася. Використання ревнивих квантифікаторів збільшує швидкість пошуку, особливо в тих випадках, коли рядок не відповідає регулярному виразу. Крім того, ревниві квантифікатори можуть бути використані для виключення небажаних збігів.
ГрупуванняПозначення групиКруглі дужки використовуються для визначення області дії й пріоритету операцій.
Шаблон усередині групи обробляється як єдине ціле й може бути квантифікованим.
Наприклад, вираз Одне із застосувань групування — повторне використання раніше знайдених груп символів (підрядків, блоків, позначених підвиразів).
При обробці виразу підрядки, що знайдені за шаблоном усередині групи, зберігаються в окремій області пам'яті й отримують номер, починаючи з одиниці. Кожному підрядку відповідає пара дужок у регулярному виразі.
Квантифікація групи не впливає на збережений результат, тобто зберігається лише перше входження.
Зазвичай підтримується до 9 нумерованих підрядків із номерами від 1 до 9, але деякі інтерпретатори дозволяють працювати з більшою кількістю.
Згодом у межах даного регулярного виразу можна використати позначення від Наприклад, регулярний вираз Також раніше знайдені підрядки можна використовувати при заміні за регулярним виразом. У такому разі в текст, що заміщає, вставляються ті ж позначення, що й у межах самого виразу. Групування без зворотного зв'язкуЯкщо група використовується тільки для групування і її результат надалі не буде потрібен, то можна використати групування виду Атомарне групуванняАтомарне групування (виду
Атомарне групування виконується ще швидше, ніж групування без зворотного зв'язку, і зберігає процесорний час при виконанні решти виразу, тому що забороняє перевірку будь-яких інших варіантів усередині групи, коли один варіант уже знайдений. Це дуже корисно при оптимізації груп із множиною різних варіантів. МодифікаториМодифікатори діють із моменту входження й до кінця регулярного виразу або протилежного модифікатора. Деякі інтерпретатори можуть застосувати модифікатор до всього виразу, а не з моменту його входження.
Групи-модифікатори можна об'єднувати в одну групу: КоментаріДля додавання коментарів у регулярний вираз можна використовувати групи-коментарі виду ПерерахуванняВертикальна риса розділяє допустимі варіанти.
Наприклад, Якщо потрібно вказати перелік варіантів усередині складнішого регулярного виразу, то його потрібно взяти в групу.
Наприклад, Перегляд уперед та назадУ більшості реалізацій регулярних виразів є спосіб провадити пошук фрагмента тексту, «переглядаючи» (але не включаючи в знайдене) навколишній текст, що розташований до або після шуканого фрагмента тексту. Наприклад, таким способом легко знайти ім'я тегу HTML, не включаючи в результат пошуку оточуючі його кутові дужки або інші знаки, але й, не упускаючи їх «з уваги» при пошуку потрібного контексту. Перегляд із запереченням використовується рідше й «стежить» за тим, щоб указані відповідності, навпаки, не зустрічалися до або після шуканого текстового фрагмента.
Пошук за умовоюУ багатьох реалізаціях регулярних виразів існує можливість вибирати, яким шляхом піде перевірка в тому або іншому місці регулярного виразу на підставі вже знайдених значень.
РізнеДва регулярних вирази можна об'єднати. У цьому разі отриманий складний вираз буде рядком, що є об'єднанням двох рядків, які відповідають цим простим виразам. Два регулярних вирази можна з'єднати інфіксним оператором «|»; у цьому разі складний вираз буде відповідатиме рядкам, що відповідають або першому, або другому простому регулярному виразу. Оператори повтору мають більший пріоритет, ніж оператор об'єднання, а останній у свою чергу має більший пріоритет, ніж оператор альтернативи. Ці правила пріоритету можна змінити за допомогою круглих дужок. ПрикладиНаведемо декілька словесних прикладів регулярних виразів: «три цифри» (такому шаблону відповідають рядки «121», «424», але не «23абв»), «дві цифри, після яких стоїть крапка, за якою йдуть кілька цифр, проте не менше однієї» (цьому шаблону відповідають «11.2», «11.4а», але не «11. »). Регулярні вирази подібні до арифметичних у тому, що формуються з менших за допомогою операторів. Заголовки розділів ВікіпедіїВідповідно до правил форматування Вікіпедії, назви розділів починаються з декількох знаків «дорівнює» на початку рядка. Наступний регулярний вираз для GNU Emacs відповідає таким заголовкам: \(^==+\).*\1 Див. також
Примітки
Посилання
Література
|
Portal di Ensiklopedia Dunia