Регулярний вираз: відмінності між версіями

[неперевірена версія][неперевірена версія]
Вилучено вміст Додано вміст
Рядок 7:
Регулярний вислів (часто називається ''шаблон'') є висловом, що описує множину рядків. Ці вислови використовуються для того, аби дати точне описання множини не перелічуючи всі її елементи. Наприклад, множина, що складається із слів «<tt>грати</tt>» та «<tt>ґрати</tt>» може бути описана регулярним висловом «<tt>[гґ]рати</tt>». В більшості формалізмів, якщо існує регулярний вислів, що описує задану множину, тоді існує нескінченна кількість висловів, які описують цю множину.
 
== Синтаксис регулярних висловів ==
 
Синтаксис регулярних висловіввиразів залежить від інтерпретатора, що використовується для їхїхньої обробки. Однак, із незначними відхиленнями, майже всі поширені механізми інтерпретатори регулярних висловіввиразів мають спільні правила.
 
=== Представлення символів ===
{{main|Представлення символів у регулярних виразах}}
Найпростіший регулярний вислів, з якого формуються складні, є звичайний символ. Більшість символів, включаючи усі літери та цифри, є регулярними висловами, що збігаються із відповідними символами в рядках.
 
==== Звичайні символи ([[Літерал (інформатика)|літерали]]) і спеціальні символи ([[метасимвол]]и) ====
Кожний метасимвол з особливим значенням мусить екрануватись попереду символом зворотної похилої риски "\".
 
Найпростішим регулярним виразом, з якого формуються складні, є звичайний символ.
Після регулярного вислову можна вказати один чи декілька операторів повтору (метасимволів):
 
Більшість символів у регулярному виразі представляють самі себе за винятком спеціальних символів (метасимволів)
{{cn|<nowiki>[</nowiki>}}
{{cn|<nowiki>]</nowiki>}}
{{cn|<nowiki>\</nowiki>}}
{{cn|<nowiki>^</nowiki>}}
{{cn|<nowiki>$</nowiki>}}
{{cn|<nowiki>.</nowiki>}}
{{cn|<nowiki>|</nowiki>}}
{{cn|<nowiki>?</nowiki>}}
{{cn|<nowiki>*</nowiki>}}
{{cn|<nowiki>+</nowiki>}}
{{cn|<nowiki>(</nowiki>}}
{{cn|<nowiki>)</nowiki>}}
{{cn|<nowiki>{</nowiki>}}
{{cn|<nowiki>}</nowiki>}},
яким може передувати символ {{cn|<nowiki>\</nowiki>}} (зворотна коса риса) («екрановані», «захищені») для представлення їх самих як символів тексту.
Можна екранувати деяку послідовність символів, розмістивши її між {{cn|<nowiki>\Q</nowiki>}} і {{cn|<nowiki>\E</nowiki>}}.
 
{| class="wikitable"
|-
! Приклад
! Відповідність
|- valign="top"
| {{cn|<nowiki>a\.?</nowiki>}}
| {{cn|a.}} або {{cn|a}}
|- valign="top"
| {{cn|<nowiki>a\\\\b</nowiki>}}
| {{cn|a\\b}}
|- valign="top"
| {{cn|<nowiki>a\[F\]</nowiki>}}
| {{cn|a[F]}}
|- valign="top"
| {{cn|<nowiki>\Q+-*/\E</nowiki>}}
| {{cn|+-*/}}
|}
 
Аналогічно можуть бути представлені інші спеціальні символи (набір символів, що вимагають екранування, може відрізнятися залежно від конкретної реалізації).
Частина символів, які в тій або іншій реалізації не вимагають екранування (наприклад, кутові дужки {{cn|<nowiki><</nowiki>}} {{cn|<nowiki>></nowiki>}}), можуть бути екрановані з міркувань зручності читання.
 
Залежно від інтерпретатора регулярних виразів, метасимволи «<tt>?</tt>», «<tt>+</tt>», «<tt>{</tt>», «<tt>|</tt>», «<tt>(</tt>», та «<tt>)</tt>» можуть втрачати своє спеціальне значення, замість цього слід вживати «<tt>\?</tt>», «<tt>\+</tt>», «<tt>\{</tt>», «<tt>\|</tt>», «<tt>\(</tt>», та «<tt>\)</tt>».
 
==== Будь-який символ ====
Метасимвол {{cn|<nowiki>.</nowiki>}} (крапка) означає один будь-який символ, але в деяких реалізаціях окрім символу нового рядка.
 
==== Символьні класи (набори символів) ====
Набір символів у квадратних дужках {{cn|<nowiki>[</nowiki>}} {{cn|<nowiki>]</nowiki>}} іменується символьним класом і дозволяє вказати інтерпретаторові регулярних виразів, що на даному місці в рядку може стояти один із перерахованих символів.
Зокрема, {{cn|<nowiki>[абв]</nowiki>}} задає можливість появи в тексті одного із трьох зазначених символів, а {{cn|<nowiki>[1234567890]</nowiki>}} задає відповідність одній із цифр.
Можливе зазначення діапазонів символів: наприклад, {{cn|<nowiki>[ А-Яа-Я]</nowiki>}} відповідає всім літерам російського алфавіту, за винятком літер «Ё» і «ё».<ref>
Для використання послідовностей літер необхідно встановити правильну кодову сторінку, у якій ці послідовності будуть іти в порядку від і до зазначених символів.
Для російської мови це [[Windows-1251]], [[ISO 8859-5]] і [[Юнікод]], тому що в [[DOS-855]], [[DOS-866]] і [[KOI8-R]] російські літери не йдуть однією цілою групою або не впорядковані за алфавітом. Особливу увагу варто приділяти літерам з [[Діакритичний знак|діакритичними знаками]], на зразок російських Ё/ё, які, як правило, розкидано поза основними діапазонами символів.</ref>
 
Якщо потрібно вказати символи, які не входять у зазначений набір, то використовують символ {{cn|<nowiki>^</nowiki>}} усередині квадратних дужок, наприклад, {{cn|<nowiki>[^0-9]</nowiki>}} означає будь-який символ, крім цифр.
 
Додавання в набір спеціальних символів шляхом екранування — найпростіший спосіб. Однак сучасні регулярні вирази успадковують також і традиційний підхід — див. [[#традиційні регулярні вирази в UNIX|Традиційні регулярні вирази]].
 
Деякі символьні класи можна замінити спеціальними метасимволами:
{| class="wikitable"
|-
! Символ
! Метасимвол
! Опис
|- valign="top"
| {{cn|<nowiki>.\d</nowiki>}}
| {{cn|Відповідає будь-якомуцифрі. символуЕквівалентно [0-9]}}
|- valign="top"
| {{cn|<nowiki>\D</nowiki>}}
| {{cn|Відповідає нецифровому символу. Еквівалентно [^0-9]}}
|- valign="top"
| {{cn|<nowiki>\s</nowiki>}}
| {{cn|Відповідає будь-якому пробільному символу. Еквівалентно [ \f\n\r\t\v]}}
|- valign="top"
| {{cn|<nowiki>\S</nowiki>}}
| {{cn|Відповідає будь-якому непробільному символу. Еквівалентно [^ \f\n\r\t\v]}}
|- valign="top"
| {{cn|<nowiki>\w</nowiki>}}
| {{cn|Відповідає будь-якому літерному символу, цифровому й знаку підкреслення. Еквівалентно <nowiki>[[:word:]]</nowiki>}}
|- valign="top"
| {{cn|<nowiki>\W</nowiki>}}
| {{cn|Відповідає будь-якому символу, крім літерного символу, цифрового або підкреслення. Еквівалентно <nowiki>[^[:word:]]</nowiki>}}
|}
 
=== Позиція всередині рядка ===
 
Наступні символи дозволяють позиціонувати регулярний вираз щодо елементів тексту: початку й кінця рядка, меж слова.
 
{| class="wikitable"
|-
! Представлення
! Позиція
! Приклад
! Відповідність
|- valign="top"
| {{cn|<nowiki>^</nowiki>}}
| Початок рядка
| {{cn|<nowiki>^a</nowiki>}}
| {{cn|{{Inverse|a}}aa aaa}}
|- valign="top"
| {{cn|<nowiki>$</nowiki>}}
| Кінець рядка
| {{cn|<nowiki>a$</nowiki>}}
| {{cn|aaa aa{{Inverse|a}}}}
|- valign="top"
| rowspan=2 | {{cn|<nowiki>\b</nowiki>}}
| rowspan=2 | Межа слова
| {{cn|<nowiki>a\b</nowiki>}}
| {{cn|aa{{Inverse|a}} aa{{Inverse|a}}}}
|-
| {{cn|<nowiki>\ba</nowiki>}}
| {{cn|{{Inverse|a}}aa {{Inverse|a}}aa}}
|- valign="top"
| {{cn|<nowiki>\B</nowiki>}}
| Не межа слова
| {{cn|<nowiki>\Ba\B</nowiki>}}
| {{cn|a{{Inverse|a}}a a{{Inverse|a}}a}}
|- valign="top"
| {{cn|<nowiki>\G</nowiki>}}
| Попередній успішний пошук
| {{cn|<nowiki>\Ga</nowiki>}}
| {{cn|{{Inverse|aaa}} aaa}} (пошук зупинився на 4-й позиції — там, де не знайшлося {{cn|a}})
|}
 
=== Квантифікація (пошук послідовностей) ===
''[[Квантифікатор]]'' після символу, символьного класу або групи визначає, скільки разів попередній вираз може зустрічатися.
Варто враховувати, що квантифікатор може стосуватися більш ніж до одного символу в регулярному виразі, тільки якщо це символьний клас або група.
 
{| class="wikitable"
|-
! Представлення
! Кількість повторень
! Приклад
! Відповідність
|- valign="top"
| {{cn|<nowiki>{</nowiki>''n''<nowiki>}</nowiki>}}
| Рівно ''n'' разів
| {{cn|<nowiki>colou{3}r</nowiki>}}
| {{cn|colouuur}}
|- valign="top"
| {{cn|<nowiki>{</nowiki>''m''<nowiki>,</nowiki>''n''<nowiki>}</nowiki>}}
| Від ''m'' до ''n'' включно
| {{cn|<nowiki>colou{2,4}r</nowiki>}}
| {{cn|colouur}}, {{cn|colouuur}}, {{cn|colouuuur}}
|- valign="top"
| {{cn|<nowiki>{</nowiki>''m''<nowiki>,}</nowiki>}}
| Не менше ''m''
| {{cn|<nowiki>colou{2,}r</nowiki>}}
| {{cn|colouur}}, {{cn|colouuur}}, {{cn|colouuuur}} {{nobr|і т.д.}}
|- valign="top"
| {{cn|<nowiki>{,</nowiki>''n''<nowiki>}</nowiki>}}
| Не більше ''n''
| {{cn|<nowiki>colou{,3}r</nowiki>}}
| {{cn|color}}, {{cn|colour}}, {{cn|colouur}}, {{cn|colouuur}}
|}
 
{| class="wikitable"
|-
! Представлення
! Кількість повторень
! Еквівалент
! Приклад
! Відповідність
|- valign="top"
| {{cn|<nowiki>*</nowiki>}}
| Нуль або більше
| {{cn|<nowiki>{0,}</nowiki>}}
| {{cn|<nowiki>colou*r</nowiki>}}
| {{cn|color}}, {{cn|colour}}, {{cn|colouur}} {{nobr|і т.д.}}
|- valign="top"
| {{cn|<nowiki>+</nowiki>}}
| Одне або більше
| {{cn|<nowiki>{1,}</nowiki>}}
| {{cn|<nowiki>colou+r</nowiki>}}
| {{cn|colour}}, {{cn|colouur}} {{nobr|і т.д.}} (але не {{cn|color}})
|- valign="top"
| {{cn|<nowiki>?</nowiki>}}
| Нуль або одне
| {{cn|Попередній вислів є необов'язковим і може збігтися максимум один раз <!-- а як же «quantifier minimizer»? -->}}
| {{cn|<nowiki>{0,1}</nowiki>}}
| {{cn|<nowiki>colou?r</nowiki>}}
| {{cn|color}}, {{cn|colour}}
|}
 
Часто використовується послідовність {{cn|<nowiki>.*</nowiki>}} для позначення будь-якої кількості будь-яких символів між двома частинами регулярного виразу.
 
Символьні класи в поєднанні із квантифікаторами дозволяють установлювати відповідності з реальними текстами.
Наприклад, колонками цифр, телефонами, поштовими адресами, елементами [[HTML]]-розмітки й ін.
 
Якщо символи
{{cn|<nowiki>{</nowiki>}}
{{cn|<nowiki>}</nowiki>}}
не утворюють квантифікатор, їхнє спеціальне значення ігнорується.
 
==== Жадібна й ледача квантифікація ====<!-- використовується для перенаправлення [[Жадібність (регулярні вирази)]] -->
 
{{Вставка
| Вирівнювання = right
| Ширина = 300px
| Заголовок = '''Приклад''' використання жадібних і ледачих виразів
| Текст =
 
Вираз {{cn|<nowiki>(<.*>)</nowiki>}} відповідає рядку, що містить декілька тегів [[HTML]]-розмітки, цілком.
 
<code>{{Inverse|<nowiki><p><b>Вікіпедія</b> - вільна енциклопедія, у якій <i>кожен</i> може змінити або доповнити будь-яку статтю</p></nowiki>}}.</code>
 
Щоб виділити окремі теги, можна застосувати ледачу версію цього виразу:
{{cn|<nowiki>(<.*?>)</nowiki>}}
Їй відповідає не весь показаний вище рядок, а окремі теги (виділені кольором):
 
<code>{{Inverse|<nowiki><p><b></nowiki>}}Вікіпедія{{Inverse|<nowiki></b></nowiki>}} - вільна енциклопедія, у якій {{Inverse|<nowiki><i></nowiki>}}кожен{{Inverse|<nowiki></i></nowiki>}} може змінити або доповнити будь-яку статтю{{Inverse|<nowiki></p></nowiki>}}.</code>
}}
 
У деяких реалізаціях квантифікаторам у регулярних виразах відповідає максимально довгий рядок із можливих (квантифікатори є ''жадібними'', {{lang-en|greedy}}).
Це може стати значною проблемою.
Наприклад, часто очікують, що вираз {{cn|<nowiki>(<.*>)</nowiki>}} знайде в тексті [[тег (мова розмітки)|теги]] [[HTML]].
Однак, якщо в тексті є більше одного HTML-тегу, то цьому виразу відповідає цілком рядок, що містить множину тегів.
 
<code>{{Inverse|<nowiki><p><b>Вікіпедія</b> - вільна енциклопедія, у якій <i>кожен</i> може змінити або доповнити будь-яку статтю</p></nowiki>}}.</code>
 
Цю проблему можна вирішити двома способами.
# Ураховувати символи, що ''не'' відповідають бажаному взірцю ({{cn|<nowiki><[^>]*></nowiki>}} для вищеописаного випадку).
# Визначити квантифікатор як ''нежадібний'' (''ледачий'', {{lang-en|lazy}}) — більшість реалізацій дозволяють це зробити, додавши після нього знак питання.
 
Використання ледачих квантифікаторів може викликати зворотну проблему, коли виразу відповідає занадто короткий, зокрема, порожній рядок.
 
{| class="wikitable"
|-
! Жадібний
! Ледачий
|- valign="top"
| {{cn|<nowiki>*</nowiki>}}
| {{cn|<nowiki>*?</nowiki>}}
| {{cn|Попередній вислів повинен збігтися нуль чи більше разів}}
|- valign="top"
| {{cn|<nowiki>+</nowiki>}}
| {{cn|<nowiki>+?</nowiki>}}
| {{cn|Попередній вислів повинен збігтись один чи більше разів}}
|- valign="top"
| {{cn|<nowiki>{N</nowiki>''n''<nowiki>,}</nowiki>}}
| {{cn|<nowiki>{</nowiki>''n''<nowiki>,}?</nowiki>}}
| {{cn|Попередній вислів повинен збігтися рівно N разів}}
|}
 
Також спільною проблемою як жадібних, так і ледачих виразів є точки повернення для перебору варіантів виразу.
Точки ставляться після кожної ітерації квантифікатора.
Якщо інтерпретатор не знайшов відповідності після квантифікатора, то він починає повертатися за всіма встановленими точками, перераховуючи звідти вираз по-іншому.
 
==== Ревнива квантифікація (Найжадібніша) ====
{{Вставка
| Вирівнювання = right
| Ширина = 440px
| Заголовок =
| Текст =
 
При пошуку виразу
{{cn|
<nowiki>(</nowiki>{{color|red|<nowiki>a</nowiki>}}<nowiki>+</nowiki>{{color|green|<nowiki>a</nowiki>}}<nowiki>+)+</nowiki>{{color|magenta|<nowiki>b</nowiki>}}
}}
у рядку {{cn|aaaaa}} інтерпретатор піде приблизно таким шляхом:
# {{cn|{{color|red|aaaaa}}}}
# {{cn|{{color|red|aaaa}}{{color|green|a}}}}
# {{cn|{{color|red|aaa}}{{color|green|a}}{{color|magenta|a}}}}
# {{cn|{{color|red|aa}}{{color|green|aaa}}}}
# {{cn|{{color|red|aa}}{{color|green|aa}}{{color|magenta|a}}}}
# {{cn|{{color|red|aa}}{{color|green|a}}{{color|red|a}}{{color|green|a}}}}
# {{cn|{{color|red|a}}{{color|green|a}}{{color|red|a}}{{color|green|a}}{{color|magenta|a}}}} — і тільки тут, перевіривши всі точки повернення, здасться.
 
При використанні ревнивого квантифікатора буде виконаний тільки перший крок алгоритму.
}}
 
На відміну від звичайної (жадібної) квантифікації, ревнива квантифікація не тільки намагається знайти максимально довгий варіант, але ще й не дозволяє алгоритму вертатися до попередніх кроків пошуку для того, щоб знайти можливі відповідності для частини регулярного виразу, що залишилася.
 
Використання ревнивих квантифікаторів збільшує швидкість пошуку, особливо в тих випадках, коли рядок не відповідає регулярному виразу. Крім того, ревниві квантифікатори можуть бути використані для виключення небажаних збігів.
 
{| class="wikitable"
|-
! Жадібний
! Ревнивий
|- valign="top"
| {{cn|<nowiki>{N,}*</nowiki>}}
| {{cn|<nowiki>*+</nowiki>}}
| {{cn|Попередній вислів повинен збігтися N чи більше разів}}
|- valign="top"
| {{cn|<nowiki>{N,M}?</nowiki>}}
| {{cn|<nowiki>?+</nowiki>}}
| {{cn|Попередній вислів повинен збігтися не менш ніж N, однак не більше за М разів}}
|- valign="top"
| {{cn|<nowiki>-+</nowiki>}}
| {{cn|<nowiki>++</nowiki>}}
| {{cn|Якщо цей символ знаходиться не на початку й не в кінці списку чи інтервалу у списку, задає інтервал}}
|- valign="top"
| {{cn|<nowiki>^{</nowiki>''n''<nowiki>,}</nowiki>}}
| {{cn|<nowiki>{</nowiki>''n''<nowiki>,}+</nowiki>}}
| {{cn|Відповідає початку рядка, при цьому не потребує символу. Якщо стоїть на початку списку, інвертує його (відповідає символу, якого немає у списку)}}
|}
 
{| class="wikitable"
|-
! Приклад
! Відповідність
|- valign="top"
| {{cn|<nowiki>$ab(xa)*+a</nowiki>}}
| {{cn|{{Inverse|abxa'''a'''}}bxaa}}; але не {{cn|abxa{{Inverse|abxaa}}}}, тому що літера {{cn|'''a'''}} уже зайнята
| {{cn|Відповідає кінцю рядка}}
|}
 
=== Групування ===
 
==== Позначення групи ====
Круглі дужки використовуються для визначення області дії й [[Пріоритет операції|пріоритету операцій]].
Шаблон усередині групи обробляється як єдине ціле й може бути квантифікованим.
Наприклад, вираз {{cn|<nowiki>(тр[ау] м-м-?)*</nowiki>}} знайде послідовність виду {{cn|трумтрам-трум-трамтрум}}.
 
==== [[Зворотний зв'язок]] ====
Одне із застосувань групування — повторне використання раніше знайдених груп символів (''підрядків'', ''блоків'', ''позначених підвиразів'').
При обробці виразу підрядки, що знайдені за шаблоном усередині групи, зберігаються в окремій області пам'яті й отримують номер, починаючи з одиниці. Кожному підрядку відповідає пара дужок у регулярному виразі.
Квантифікація групи не впливає на збережений результат, тобто зберігається лише перше входження.
Зазвичай підтримується до 9 нумерованих підрядків із номерами від 1 до 9, але деякі інтерпретатори дозволяють працювати з більшою кількістю.
Згодом у межах даного регулярного виразу можна використати позначення від {{cn|<nowiki>\1</nowiki>}} до {{cn|<nowiki>\9</nowiki>}} для перевірки на збіг із раніше знайденим підрядком.
 
Наприклад, регулярний вираз {{cn|<nowiki>(та|ту)-\1</nowiki>}} знайде рядок {{cn|та-та}} або {{cn|ту-ту}}, але пропустить рядок {{cn|та-ту}}.
 
Також раніше знайдені підрядки можна використовувати при заміні за регулярним виразом.
У такому разі в текст, що заміщає, вставляються ті ж позначення, що й у межах самого виразу.
 
==== Групування без зворотного зв'язку ====
Якщо група використовується тільки для групування і її результат надалі не буде потрібен, то можна використати групування виду {{cn|<nowiki>(?:</nowiki>''шаблон''<nowiki>)</nowiki>}}.
Під результат такого групування не виділяється окрема область пам'яті й, відповідно, їй не призначається номер.
Це позитивно впливає на швидкість виконання виразу, але знижує зручність читання.
 
==== Атомарне групування ====
Атомарне групування (виду {{cn|<nowiki>(?></nowiki>''шаблон''<nowiki>)</nowiki>}}), так само як групування без зворотного зв'язку, не створює зворотних зв'язків.
На відміну від нього, таке групування забороняє вертатися назад по рядку, якщо частина шаблону вже знайдена.
{| class="wikitable"
|-
! Приклад
! Відповідність
! Створювані групи
|-
| {{cn|<nowiki>a(bc|b|x)cc</nowiki>}}
| rowspan=2 | {{cn|{{Inverse|abcc}}axcc}}
{{cn|abcc{{Inverse|axcc}}}}
| {{cn|a{{Inverse|b}}ccaxcc}}
{{cn|abcca{{Inverse|x}}cc}}
|-
| {{cn|<nowiki>a(?:bc|b|x)cc</nowiki>}}
| rowspan=3 | немає
|-
| {{cn|<nowiki>a(?>bc|b|x)cc</nowiki>}}
| {{cn|abcc{{Inverse|axcc}}}}
але не {{cn|{{Inverse|abcc}}axcc}}: варіант {{cn|x}} знайдений, інші зігноровані
|-
| {{cn|<nowiki>a(?>x*)xa</nowiki>}}
| не знайдеться {{cn|{{Inverse|axxxa}}}}: усі {{cn|x}} зайняті, і немає повернення всередину групи
|}
 
Атомарне групування виконується ще швидше, ніж групування без зворотного зв'язку, і зберігає процесорний час при виконанні решти виразу, тому що забороняє перевірку будь-яких інших варіантів усередині групи, коли один варіант уже знайдений.
Це дуже корисно при оптимізації груп із множиною різних варіантів.
 
==== Модифікатори ====
Модифікатори діють із моменту входження й до кінця регулярного виразу або протилежного модифікатора.
Деякі інтерпретатори можуть застосувати модифікатор до всього виразу, а не з моменту його входження.
{| class="wikitable"
|-
! Синтаксис
! colspan=2 | Опис
|-
| {{cn|<nowiki>(?i)</nowiki>}}
| Включає
| rowspan=2 | нечутливість виразу до регістра символів ({{lang-en|case insensitivity}})
|-
| {{cn|<nowiki>(?-i)</nowiki>}}
| Виключає
|-
| {{cn|<nowiki>(?s)</nowiki>}}
| Включає
| rowspan=2 | режим відповідності точки символам переносу рядка й повернення каретки
|-
| {{cn|<nowiki>(?-s)</nowiki>}}
| Виключає
|-
| {{cn|<nowiki>(?m)</nowiki>}}
| rowspan=2 | Символи {{cn|<nowiki>^</nowiki>}} і {{cn|<nowiki>$</nowiki>}} викликають відповідність тільки
| після й до символів нового рядка
|-
| {{cn|<nowiki>(?-m)</nowiki>}}
| із початком і кінцем рядка
|-
| {{cn|<nowiki>(?x)</nowiki>}}
| Включає
| rowspan=2 | режим без урахування пробілів між частинами регулярного виразу й дозволяє використовувати {{cn|<nowiki>#</nowiki>}} для коментарів
|-
| {{cn|<nowiki>(?-x)</nowiki>}}
| Виключає
|}
 
Групи-модифікатори можна об'єднувати в одну групу: {{cn|<nowiki>(?i-sm)</nowiki>}}.
Така група включає режим {{cn|<nowiki>i</nowiki>}} і виключає режим {{cn|<nowiki>s</nowiki>}}, {{cn|<nowiki>m</nowiki>}}.
Якщо використання модифікаторів потрібне тільки в межах групи, то потрібний шаблон вказується всередині групи після модифікаторів і двокрапки.
Наприклад, {{cn|<nowiki>(?-i)(?i:tv)set</nowiki>}} знайде {{cn|TVset}}, але не {{cn|TVSET}}.
 
==== Коментарі ====
Для додавання коментарів у регулярний вираз можна використовувати групи-коментарі виду {{cn|<nowiki>(?#</nowiki>''коментар''<nowiki>)</nowiki>}}.
Така група інтерпретатором цілком ігнорується й не перевіряється на входження в текст.
Наприклад, вираз {{cn|<nowiki>А(?#тут коментар)Б</nowiki>}} відповідає рядку {{cn|АБ}}.
 
=== Перерахування ===
Вертикальна риса розділяє допустимі варіанти.
Наприклад, {{cn|<nowiki>gray|grey</nowiki>}} відповідає {{cn|gray}} або {{cn|grey}}.
Варто пам'ятати, що перебір варіантів виконується зліва праворуч, як вони вказані.
 
Якщо потрібно вказати перелік варіантів усередині складнішого регулярного виразу, то його потрібно взяти в групу.
Наприклад, {{cn|<nowiki>gray|grey</nowiki>}} або {{cn|<nowiki>gr(a|e)y</nowiki>}} описують рядок {{cn|gray}} або {{cn|grey}}.
У разі односимвольних альтернатив кращий варіант {{cn|<nowiki>gr[ae]y</nowiki>}}, тому що порівняння із символьним класом виконується простіше, ніж обробка групи з перевіркою на всі її можливі модифікатори й генерацією зворотного зв'язку.
 
=== Перегляд уперед та назад ===
У більшості реалізацій регулярних виразів є спосіб провадити пошук фрагмента тексту, «переглядаючи» (але не включаючи в знайдене) навколишній текст, що розташований до або після шуканого фрагмента тексту.
Наприклад, таким способом легко знайти ім'я тегу HTML, не включаючи в результат пошуку оточуючі його кутові дужки або інші знаки, але й, не упускаючи їх «з уваги» при пошуку потрібного контексту.
Перегляд із запереченням використовується рідше й «стежить» за тим, щоб указані відповідності, навпаки, не зустрічалися до або після шуканого текстового фрагмента.
 
{| class="wikitable"
|-
! Представлення
! Вид перегляду
! Приклад
! Відповідність
|- valign="top"
| {{cn|<nowiki>\b(?=</nowiki>''шаблон''<nowiki>)</nowiki>}}
| Позитивний перегляд уперед
| {{cn|Відповідає межі слова}}
| {{cn|<nowiki>Людовик(?=XVI)</nowiki>}}
| {{cn|ЛюдовикXV, {{Inverse|Людовик}}XVI, {{Inverse|Людовик}}XVIII, ЛюдовикLXVII, ЛюдовикXXL}}
|- valign="top"
| {{cn|<nowiki>\B(?!</nowiki>''шаблон''<nowiki>)</nowiki>}}
| Негативний перегляд уперед (із запереченням)
| {{cn|Відповідає порожньому рядку, якщо в цьому місці не закінчується або не починається слово}}
| {{cn|<nowiki>Людовик(?!XVI)</nowiki>}}
| {{cn|{{Inverse|Людовик}}XV, ЛюдовикXVI, ЛюдовикXVIII, {{Inverse|Людовик}}LXVII, {{Inverse|Людовик}}XXL}}
|- valign="top"
| {{cn|<nowiki>\(?<=</nowiki>''шаблон''<nowiki>)</nowiki>}}
| Позитивний перегляд назад
| {{cn|Відповідає пустому рядку в початку слова}}
| {{cn|<nowiki>(?<=Сергій )Іванов</nowiki>}}
| {{cn|Сергій {{Inverse|Іванов}}, Ігор Іванов}}
|- valign="top"
| {{cn|<nowiki>\(?<!</nowiki>''шаблон''<nowiki>)</nowiki>}}
| Негативний перегляд назад (із запереченням)
| {{cn|Відповідає пустому рядку в кінці слова}}
| {{cn|<nowiki>(?<!Сергій )Іванов</nowiki>}}
| {{cn|Сергій Іванов, Ігор {{Inverse|Іванов}}}}
|}
 
=== Пошук за умовою ===
Два регулярних вислови можна об'єднати. У цьому разі отриманий складний вислів буде відповідатиме рядку, що є об'єднанням двох рядків, які відповідають наведеноми регулярниму вислову.
У багатьох реалізаціях регулярних виразів існує можливість вибирати, яким шляхом піде перевірка в тому або іншому місці регулярного виразу на підставі вже знайдених значень.
 
{| class="wikitable"
Два регулярних вислови можна з'єднати інфіксним оператором
|-
«<tt>|</tt>»; у цьому разі складний вислів буде відповідатиме рядкам, що відповідають або першому, або другому простому регулярному вислову.
! Представлення
! Пояснення
! Приклад
! Відповідність
|- valign="top"
| {{cn|<nowiki>(?(?=</nowiki>''якщо''<nowiki>)</nowiki>''то''<nowiki>|</nowiki>''інакше''<nowiki>)</nowiki>}}
| Якщо операція перегляду успішна, то далі виконується частина {{cn|''то''}}, інакше виконується частина {{cn|''інакше''}}. У виразі може використовуватися кожна із чотирьох операцій перегляду. Варто враховувати, що операція перегляду нульової ширини, тому частини {{cn|''то''}} у разі позитивного або {{cn|''інакше''}} у разі негативного перегляду повинні містити в собі опис шаблону з операції перегляду.
| {{cn|<nowiki>(?(?<=а)м|п)</nowiki>}}
| {{cn|ма{{Inverse|м}},{{Inverse|п}}ап}}
|- valign="top"
| {{cn|<nowiki>(?(</nowiki>''n''<nowiki>)</nowiki>''то''<nowiki>|</nowiki>''інакше''<nowiki>)</nowiki>}}
| Якщо '' n''-а група повернула значення, то пошук за умовою виконується за шаблоном {{cn|''то''}}, інакше за шаблоном {{cn|''інакше''}}.
| {{cn|<nowiki>(а)?(?(1)м|п)</nowiki>}}
| {{cn|м{{Inverse|ам}},{{Inverse|п}}а{{Inverse|п}}}}
|}
 
=== Різне ===
Оператори повтору мають більший пріоритет, ніж оператор об'єднання, а останній у свою чергу має більший пріоритет, ніж оператор альтернативи. Ці правила пріоритету можна змінити за допомогою круглих дужок.
 
Два регулярних вирази можна об'єднати. У цьому разі отриманий складний вираз буде рядком, що є об'єднанням двох рядків, які відповідають цим простим виразам.
=== Стандартні та поширені регулярні вислови ===
 
Два регулярних вирази можна з'єднати інфіксним оператором
В залежності від інтерпретатора регулярних висловів, метасимволи «<tt>?</tt>»,
«<tt>|</tt>»; у цьому разі складний вираз буде відповідатиме рядкам, що відповідають або першому, або другому простому регулярному виразу.
«<tt>+</tt>», «<tt>{</tt>», «<tt>|</tt>», «<tt>(</tt>»,
 
та «<tt>)</tt>» можуть втрачати своє спеціальне значення, замість цього
Оператори повтору мають більший пріоритет, ніж оператор об'єднання, а останній у свою чергу має більший пріоритет, ніж оператор альтернативи. Ці правила пріоритету можна змінити за допомогою круглих дужок.
слід вживати «<tt>\?</tt>», «<tt>\+</tt>», «<tt>\{</tt>»,
«<tt>\|</tt>», «<tt>\(</tt>», та «<tt>\)</tt>».
 
== Приклади ==