Регулярные выражения с обратными ссылками — различия между версиями
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), который действует на первую группу. Обратная ссылка показывает, что после группы — — и символа должен быть описан тот же текст, что содержится в ней.
Порядок нумерации групп: сначала внешняя, потом вложенные (в порядке обхода в глубину).
Содержание
Примеры
- Выразим язык тандемных повторов над алфавитом используя механизм обратных ссылок:
 
- Данный язык не является регулярным, однако его можно представить с помощью регулярных выражений с использованием обратных ссылок.
 
- Выведем регулярное выражение для языка, состоящего из палиндромов фиксированной длины или :
 
- для чётного :
 - для нечётного :
 
- где «» – любой одиночный символ.
 
- Запишем регулярное выражение для языка . Данный язык не является ни регулярным, ни контекстно-свободным (по лемме о разрастании), но также легко представим с помощью обратных ссылок:
 
- .
 
- Группа — — представляет из себя регулярное выражение для языка , последующие за ней обратные ссылки используются для многократного использования текста группы. Поэтому после «» обязан присутствовать текст «».
 
- Язык можно представить при помощи обратных ссылок:
 
- где «» – ссылка, осуществляющая рекурсивный вызов первой группы. Следущий за ссылкой знак вопроса обозначает использование группы или раз, то есть осуществление рекурсивного вызова или его окончание.
 
-  ссылается на первую группу — , что равносильно рекурсивной зависимости:        
 
- Очевидно, что все слова из языка удовлетворяют данному регулярному выражению.
 
Теорема о КС-языках
| Теорема: | 
С помощью механизма обратных ссылок можно представить любой контекстно-свободный язык.  | 
| Доказательство: | 
| 
 Любую контекстно-свободную грамматику можно привести к нормальной форме Хомского, следовательно, достаточно доказать, что грамматику, заданную в нормальной форме, можно преобразовать в регулярное выражение с обратными ссылками. Рассмотрим правила, которые могут содержаться в такой грамматике: 
 
 
 Представим каждое из них в виде регулярного выражения с обратными ссылками. Используя ссылки на регулярные выражения, соответствующие нетерминалам и , можно представить первое правило: где и соответствуют нетерминалам и ; Второе и третье правила не требуют использования обратных ссылок: 
 Таким образом, регулярные выражения с обратными ссылками имеют бо́льшую мощность по сравнению с обычными. С их помощью реализуются как регулярные языки, так и контекстно-свободные грамматики, а также некоторые контекстно-зависимые.  | 
Примеры преобразования
Рассмотрим следующую КС-грамматику:
Очевидно, что эквивалентным будет выражение , где группы соответствуют .
Другой пример:
Регулярное выражение для этой грамматики будет выглядеть так:
Применение
С помощью обратных ссылок можно составить регулярные выражения для языка тандемных повторов и других языков, где требуется «запоминать» части входящих в язык слов.
Регулярные выражения в языках программирования зачастую поддерживают обратные ссылки. На практике их можно использовать, например, для парсинга -выражений (поиск подстрок, содержащихся в определённых тегах).
См. также
- Регулярные языки: два определения и их эквивалентность
 - Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора
 - Нормальная форма Хомского
 - Иерархия Хомского формальных грамматик