Регулярные выражения с обратными ссылками — различия между версиями
Daviondk (обсуждение | вклад) м |
Daviondk (обсуждение | вклад) (Правки) |
||
Строка 11: | Строка 11: | ||
Порядок нумерации групп: сначала внешняя, потом вложенные (в порядке [[Обход в глубину, цвета вершин|обхода в глубину]]). | Порядок нумерации групп: сначала внешняя, потом вложенные (в порядке [[Обход в глубину, цвета вершин|обхода в глубину]]). | ||
==Примеры== | ==Примеры== | ||
− | * | + | * Выразим язык тандемных повторов над алфавитом <tex>\Sigma=\{0,1\},</tex> используя механизм обратных ссылок: |
:<tex>L=((0|1)^∗)\backslash 1</tex> | :<tex>L=((0|1)^∗)\backslash 1</tex> | ||
− | :Данный язык не является регулярным, однако его можно представить с помощью регулярных выражений с использованием обратных ссылок. | + | :Данный язык не является [[Регулярные языки: два определения и их эквивалентность|регулярным]], однако его можно представить с помощью регулярных выражений с использованием обратных ссылок. |
* Выведем регулярное выражение для языка, состоящего из палиндромов фиксированной длины <tex>n=2\cdot m\,</tex> или <tex>\,n=2\cdot m+1</tex>: | * Выведем регулярное выражение для языка, состоящего из палиндромов фиксированной длины <tex>n=2\cdot m\,</tex> или <tex>\,n=2\cdot m+1</tex>: | ||
# для чётного <tex>n</tex>: <tex>\;(.)(.)(.)...(.)\backslash m...\backslash 3\backslash 2\backslash 1;</tex> | # для чётного <tex>n</tex>: <tex>\;(.)(.)(.)...(.)\backslash m...\backslash 3\backslash 2\backslash 1;</tex> | ||
Строка 59: | Строка 59: | ||
Используя ссылки на регулярные выражения, соответствующие нетерминалам <tex>B</tex> и <tex>C</tex>, можно представить первое правило: | Используя ссылки на регулярные выражения, соответствующие нетерминалам <tex>B</tex> и <tex>C</tex>, можно представить первое правило: | ||
− | <tex>A\rightarrow BC\leftrightarrow A=((? | + | <tex>A\rightarrow BC\leftrightarrow A=((?1)\,(?2)),\,</tex> где <tex>1</tex> и <tex>2</tex> соответствуют нетерминалам <tex>B</tex> и <tex>С</tex>; |
Второе и третье правила не требуют использования обратных ссылок: | Второе и третье правила не требуют использования обратных ссылок: | ||
Строка 70: | Строка 70: | ||
}} | }} | ||
− | + | ===Примеры преобразования=== | |
Рассмотрим следующую КС-грамматику: | Рассмотрим следующую КС-грамматику: | ||
<tex>S\rightarrow A\\A\rightarrow BC\\A\rightarrow CD</tex> | <tex>S\rightarrow A\\A\rightarrow BC\\A\rightarrow CD</tex> | ||
− | Очевидно, что эквивалентным будет выражение <tex>((? | + | Очевидно, что эквивалентным будет выражение <tex>((?1)\,(?2)\,|\,(?2)\,(?3))\,</tex>, где группы <tex>1, 2, 3</tex> соответствуют <tex>B, C, D</tex>. |
Строка 86: | Строка 86: | ||
С помощью обратных ссылок можно составить регулярные выражения для языка тандемных повторов и других языков, где требуется «запоминать» части входящих в язык слов. | С помощью обратных ссылок можно составить регулярные выражения для языка тандемных повторов и других языков, где требуется «запоминать» части входящих в язык слов. | ||
− | Регулярные выражения в языках программирования зачастую поддерживают обратные ссылки. На практике их можно использовать, например, для парсинга html-выражений (поиск подстрок, содержащихся в определённых тегах). | + | Регулярные выражения в языках программирования зачастую поддерживают обратные ссылки. На практике их можно использовать, например, для парсинга <tex>html</tex>-выражений (поиск подстрок, содержащихся в определённых тегах). |
==См. также== | ==См. также== | ||
* [[Регулярные языки: два определения и их эквивалентность]] | * [[Регулярные языки: два определения и их эквивалентность]] | ||
Строка 97: | Строка 97: | ||
* [https://regexr.com Визуализатор регулярных выражений] | * [https://regexr.com Визуализатор регулярных выражений] | ||
* [https://habr.com/post/171667/ habr.com {{---}} Истинное могущество регулярных выражений] | * [https://habr.com/post/171667/ habr.com {{---}} Истинное могущество регулярных выражений] | ||
+ | |||
+ | [[Категория: Дискретная математика и алгоритмы]] | ||
+ | [[Категория: Автоматы и регулярные языки]] | ||
+ | [[Категория: Базовые понятия о грамматиках]] |
Версия 23:27, 14 мая 2018
Определение: |
Регулярные выражения с обратными ссылками (англ. regex with backreferences) — одна из разновидностей регулярных выражений, дающая возможность использовать в них слова, принадлежащие некоторой группе. |
— пример такого регулярного выражения.
Выражение, заключённое в скобки, называется группой (англ. capture group). Скобки захватывают текст, сопоставленный регулярным выражением внутри нумерованной группы, который может быть повторно использован с помощью обратной ссылки с указанием номера группы.
«
» – символ обратной ссылки (англ. backreference), который действует на первую группу. Обратная ссылка показывает, что после группы — — и символа должен быть описан тот же текст, что содержится в ней.Порядок нумерации групп: сначала внешняя, потом вложенные (в порядке обхода в глубину).
Содержание
Примеры
- Выразим язык тандемных повторов над алфавитом используя механизм обратных ссылок:
- Данный язык не является регулярным, однако его можно представить с помощью регулярных выражений с использованием обратных ссылок.
- Выведем регулярное выражение для языка, состоящего из палиндромов фиксированной длины или :
- для чётного :
- для нечётного :
- где « » – любой одиночный символ.
- Запишем регулярное выражение для языка лемме о разрастании), но также легко представим с помощью обратных ссылок: . Данный язык не является ни регулярным, ни контекстно-свободным (по
- .
- Группа — — представляет из себя регулярное выражение для языка , последующие за ней обратные ссылки используются для многократного использования текста группы. Поэтому после « » обязан присутствовать текст « ».
- Язык можно представить при помощи обратных ссылок:
- где « » – ссылка, осуществляющая рекурсивный вызов первой группы. Следущий за ссылкой знак вопроса обозначает использование группы или раз, то есть осуществление рекурсивного вызова или его окончание.
- Очевидно, что все слова из языка удовлетворяют данному регулярному выражению.
Теорема о КС-языках
Теорема: |
С помощью механизма обратных ссылок можно представить любой контекстно-свободный язык. |
Доказательство: |
Любую контекстно-свободную грамматику можно привести к нормальной форме Хомского, следовательно, достаточно доказать, что грамматику, заданную в нормальной форме, можно преобразовать в регулярное выражение с обратными ссылками. Рассмотрим правила, которые могут содержаться в такой грамматике:
Представим каждое из них в виде регулярного выражения с обратными ссылками. Используя ссылки на регулярные выражения, соответствующие нетерминалам и , можно представить первое правило:где и соответствуют нетерминалам и ; Второе и третье правила не требуют использования обратных ссылок:
Таким образом, регулярные выражения с обратными ссылками имеют бо́льшую мощность по сравнению с обычными. С их помощью реализуются как регулярные языки, так и контекстно-свободные грамматики, а также некоторые контекстно-зависимые. |
Примеры преобразования
Рассмотрим следующую КС-грамматику:
Очевидно, что эквивалентным будет выражение
, где группы соответствуют .
Другой пример:
Регулярное выражение для этой грамматики будет выглядеть так:
Применение
С помощью обратных ссылок можно составить регулярные выражения для языка тандемных повторов и других языков, где требуется «запоминать» части входящих в язык слов.
Регулярные выражения в языках программирования зачастую поддерживают обратные ссылки. На практике их можно использовать, например, для парсинга
-выражений (поиск подстрок, содержащихся в определённых тегах).См. также
- Регулярные языки: два определения и их эквивалентность
- Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора
- Нормальная форма Хомского
- Иерархия Хомского формальных грамматик