Регулярные выражения с обратными ссылками — различия между версиями
Daviondk (обсуждение | вклад) (Правки) |
Daviondk (обсуждение | вклад) (Правки) |
||
Строка 1: | Строка 1: | ||
+ | ==Базовые определения== | ||
{{Определение | {{Определение | ||
− | |id= | + | |id=groupdef |
− | |definition=''' | + | |definition='''Группа''' (англ. ''capture group'') {{---}} часть [[Регулярные языки: два определения и их эквивалентность|регулярного выражения]]. Группа заключается в круглые скобки. |
}} | }} | ||
− | |||
− | + | Каждой группе соответствует порядковый номер. Нумерация идёт слева направо: номеру группы соответствует порядковый номер открывающей круглой скобки этой группы в тексте регулярного выражения. | |
− | + | Пример: <tex>(ab(cd))(ef).</tex> Группа №1 {{---}} <tex>(ab(cd)),\,</tex> группа №2 {{---}} <tex>(cd),\,</tex> группа №3 {{---}} <tex>(ef)</tex> | |
− | + | {{Определение | |
− | + | |id=referencedef | |
− | + | |definition='''Обратная ссылка''' (англ. ''backreference'') {{---}} механизм повторного использования групп или [[Основные определения, связанные со строками|слов]] группы. | |
+ | }} | ||
− | + | Для повторного использования '''слова''' группы используется обозначение <tex>\backslash n,\,</tex> где <tex>n</tex> {{---}} номер группы. | |
− | : | + | Пример использования: <tex>(a^*)\backslash 1.\,</tex> Данное регулярное выражение будет допускать только слова, в которых количество букв <tex>a</tex> чётно. |
− | |||
− | |||
− | |||
− | + | Для повторного использования '''регулярного выражения''' группы используется обозначение <tex>(?n),\,</tex> где <tex>n</tex> {{---}} номер группы. Использование круглых скобок обусловленно тем, что <tex>?</tex> как управляющий символ уже используется. | |
− | |||
− | : | + | Обратите внимание, что символы круглых скобок и обратной косой являются управляющими. Чтобы использовать их непосредственно как часть слова, их нужно [https://ru.wikipedia.org/wiki/Экранирование_символов экранировать]. |
− | : | + | Пример экранирования (в данном случае в качестве символа экранирования используется символ обратной косой черты): <tex>\backslash 1</tex> {{---}} обратная ссылка на первую группу, <tex>\backslash\backslash 1</tex> {{---}} слово, состоящее из символа обратной косой черты и единицы. |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
+ | {{Определение | ||
+ | |id=maindef | ||
+ | |definition='''Регулярные выражения с обратными ссылками''' (англ. ''regex with backreferences'') {{---}} регулярные выражения, использующие механизм обратных ссылок. | ||
+ | }} | ||
+ | ==Примеры== | ||
+ | # Регулярное выражение <tex>(aba?)c(?1)\,</tex> породит язык <tex>L=\{abcab,abacab,abcaba,abacaba\}.</tex> | ||
+ | # Выразим язык тандемных повторов над алфавитом <tex>\Sigma=\{0,1\},</tex> используя механизм обратных ссылок: | ||
+ | #: <tex>L=((0|1)^∗)\backslash 1.</tex> | ||
+ | #: Данный язык не является [[Регулярные языки: два определения и их эквивалентность|регулярным]], однако его можно представить с помощью регулярных выражений с использованием обратных ссылок. | ||
+ | # Выведем регулярное выражение для языка, состоящего из палиндромов фиксированной длины <tex>n=2\cdot m\,</tex> или <tex>\,n=2\cdot m+1</tex>: | ||
+ | #* для чётного <tex>n</tex>: <tex>\;(a_1)(a_2)(a_3)\dotsc(a_m)\backslash m\dotsc\backslash 3\backslash 2\backslash 1;</tex> | ||
+ | #* для нечётного <tex>n</tex>: <tex>\;(a_1)(a_2)(a_3)\dotsc(a_m)a_{m+1}\backslash m\dotsc\backslash 3\backslash 2\backslash 1,\;</tex> | ||
+ | #: где <tex>a_i</tex> – любой одиночный символ. | ||
+ | # Запишем выражение для языка <tex>L=b^kab^kab^ka,\,k>0.\,</tex> Данный язык не является ни регулярным, ни контекстно-свободным (по [[Лемма о разрастании для КС-грамматик|лемме о разрастании]]), то есть является [[Иерархия Хомского формальных грамматик|контекстно-зависимым]], но также легко представим с помощью обратных ссылок: | ||
+ | #: <tex>L=(bb^*a)\backslash 1\backslash 1</tex>. | ||
+ | # Язык <tex>L=a^nb^n,\,n>0\,</tex> можно представить при помощи обратных ссылок: | ||
+ | #: <tex>L=(a(?1)?b).</tex> | ||
+ | #: Следущий за ссылкой <tex>(?1)</tex> знак вопроса обозначает использование группы <tex>0</tex> или <tex>1</tex> раз, то есть осуществление рекурсивного вызова или его окончание. | ||
+ | #: <tex>?1</tex> ссылается на первую группу {{---}} <tex>(a(?1)?b)</tex>, что равносильно рекурсивной зависимости: | ||
+ | #:::: <tex>(a(?1)?b)=</tex> | ||
+ | #::: <tex>=(a(a(?1)?b)?b)=</tex> | ||
+ | #:: <tex>=(a(a(a(?1)?b)?b)?b)=</tex> | ||
+ | #: <tex>=(a(a(a(a(?1)?b)?b)?b)?b)=\dotsc</tex> | ||
+ | #: Очевидно, что все слова из языка <tex>L</tex> удовлетворяют данному регулярному выражению. | ||
==Теорема о КС-языках== | ==Теорема о КС-языках== | ||
{{Теорема | {{Теорема | ||
Строка 47: | Строка 54: | ||
|statement=С помощью механизма обратных ссылок можно представить любой [[Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора|контекстно-свободный язык]]. | |statement=С помощью механизма обратных ссылок можно представить любой [[Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора|контекстно-свободный язык]]. | ||
|proof= | |proof= | ||
− | Любую контекстно-свободную грамматику можно привести к [[Нормальная форма Хомского|нормальной форме Хомского]], следовательно, достаточно доказать, что грамматику, заданную в | + | Любую контекстно-свободную грамматику можно привести к [[Нормальная форма Хомского|нормальной форме Хомского]], следовательно, достаточно доказать, что грамматику, заданную в такой форме, можно преобразовать в регулярное выражение с обратными ссылками. Рассмотрим правила, которые могут содержаться в такой грамматике: |
− | <tex>A\rightarrow BC</tex> | + | <tex>A\rightarrow BC\\A\rightarrow a\\S\rightarrow\varepsilon</tex> |
− | + | Представим каждое из них в виде регулярного выражения с обратными ссылками. | |
− | |||
− | |||
− | |||
− | Представим каждое из них в виде регулярного выражения с обратными ссылками. | ||
Используя ссылки на регулярные выражения, соответствующие нетерминалам <tex>B</tex> и <tex>C</tex>, можно представить первое правило: | Используя ссылки на регулярные выражения, соответствующие нетерминалам <tex>B</tex> и <tex>C</tex>, можно представить первое правило: | ||
Строка 63: | Строка 66: | ||
Второе и третье правила не требуют использования обратных ссылок: | Второе и третье правила не требуют использования обратных ссылок: | ||
− | <tex>A\rightarrow a\leftrightarrow A=a;</tex> | + | <tex>A\rightarrow a\leftrightarrow A=a;\\S\rightarrow\varepsilon\leftrightarrow S=\varepsilon.</tex> |
− | <tex> | + | Если какому-то нетерминалу <tex>A</tex> соответствуют несколько регулярных выражений <tex>r_1, r_2, \dotsc, r_n</tex>, заменить их на одно: <tex>A=((r_1)|(r_2)|\dotsc|(r_n))\,</tex> (очевидно, что оно также будет соответствовать этому нетерминалу). |
− | + | Регулярное выражение для <tex>S</tex> будет искомым. | |
}} | }} | ||
+ | |||
+ | Регулярные выражения с обратными ссылками имеют бо́льшую мощность по сравнению с обычными. С их помощью реализуются как регулярные языки, так и контекстно-свободные грамматики, а также некоторые контекстно-зависимые (см. пример 4). | ||
===Примеры преобразования=== | ===Примеры преобразования=== | ||
Строка 75: | Строка 80: | ||
<tex>S\rightarrow A\\A\rightarrow\varepsilon\\A\rightarrow BA\\B\rightarrow b\\B\rightarrow c</tex> | <tex>S\rightarrow A\\A\rightarrow\varepsilon\\A\rightarrow BA\\B\rightarrow b\\B\rightarrow c</tex> | ||
− | + | Эквивалентным будет выражение <tex>(((b\,|\,c)\,(?1)?)?).</tex> | |
Другой пример: | Другой пример: |
Версия 22:18, 27 мая 2018
Содержание
Базовые определения
Определение: |
Группа (англ. capture group) — часть регулярного выражения. Группа заключается в круглые скобки. |
Каждой группе соответствует порядковый номер. Нумерация идёт слева направо: номеру группы соответствует порядковый номер открывающей круглой скобки этой группы в тексте регулярного выражения.
Пример:
Группа №1 — группа №2 — группа №3 —
Определение: |
Обратная ссылка (англ. backreference) — механизм повторного использования групп или слов группы. |
Для повторного использования слова группы используется обозначение где — номер группы.
Пример использования:
Данное регулярное выражение будет допускать только слова, в которых количество букв чётно.Для повторного использования регулярного выражения группы используется обозначение
где — номер группы. Использование круглых скобок обусловленно тем, что как управляющий символ уже используется.
Обратите внимание, что символы круглых скобок и обратной косой являются управляющими. Чтобы использовать их непосредственно как часть слова, их нужно экранировать.
Пример экранирования (в данном случае в качестве символа экранирования используется символ обратной косой черты):
— обратная ссылка на первую группу, — слово, состоящее из символа обратной косой черты и единицы.
Определение: |
Регулярные выражения с обратными ссылками (англ. regex with backreferences) — регулярные выражения, использующие механизм обратных ссылок. |
Примеры
- Регулярное выражение породит язык
- Выразим язык тандемных повторов над алфавитом
- Данный язык не является регулярным, однако его можно представить с помощью регулярных выражений с использованием обратных ссылок.
используя механизм обратных ссылок:
- Выведем регулярное выражение для языка, состоящего из палиндромов фиксированной длины
- для чётного :
- для нечётного :
- где – любой одиночный символ.
или :
- Запишем выражение для языка лемме о разрастании), то есть является контекстно-зависимым, но также легко представим с помощью обратных ссылок:
- .
Данный язык не является ни регулярным, ни контекстно-свободным (по - Язык
- Следущий за ссылкой знак вопроса обозначает использование группы или раз, то есть осуществление рекурсивного вызова или его окончание.
-
- Очевидно, что все слова из языка удовлетворяют данному регулярному выражению.
можно представить при помощи обратных ссылок:
Теорема о КС-языках
Теорема: |
С помощью механизма обратных ссылок можно представить любой контекстно-свободный язык. |
Доказательство: |
Любую контекстно-свободную грамматику можно привести к нормальной форме Хомского, следовательно, достаточно доказать, что грамматику, заданную в такой форме, можно преобразовать в регулярное выражение с обратными ссылками. Рассмотрим правила, которые могут содержаться в такой грамматике:
Представим каждое из них в виде регулярного выражения с обратными ссылками. Используя ссылки на регулярные выражения, соответствующие нетерминалам и , можно представить первое правило:где и соответствуют нетерминалам и ; Второе и третье правила не требуют использования обратных ссылок:
Если какому-то нетерминалу Регулярное выражение для соответствуют несколько регулярных выражений , заменить их на одно: (очевидно, что оно также будет соответствовать этому нетерминалу). будет искомым. |
Регулярные выражения с обратными ссылками имеют бо́льшую мощность по сравнению с обычными. С их помощью реализуются как регулярные языки, так и контекстно-свободные грамматики, а также некоторые контекстно-зависимые (см. пример 4).
Примеры преобразования
Рассмотрим следующую КС-грамматику:
Эквивалентным будет выражение
Другой пример:
Регулярное выражение для этой грамматики будет выглядеть так:
Применение
С помощью обратных ссылок можно составить регулярные выражения для языка тандемных повторов и других языков, где требуется «запоминать» части входящих в язык слов.
Регулярные выражения в языках программирования зачастую поддерживают обратные ссылки. На практике их можно использовать, например, для парсинга
-выражений (поиск подстрок, содержащихся в определённых тегах).См. также
- Регулярные языки: два определения и их эквивалентность
- Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора
- Нормальная форма Хомского
- Иерархия Хомского формальных грамматик