Когда регулярное выражение не является регулярным выражением?


9

Поскольку я готовлюсь к курсу обучения в колледже формальных языков, я наткнулся на эти увлекательные посты ( Один Два ), в которых описывается, как найти простое число с помощью регулярного выражения . Как я уже сказал, регулярное выражение , а не регулярное выражение . Поскольку регулярное выражение может совпадать со строками, вычисленными автоматами конечного состояния, а FSA не может найти простое число, регулярное выражение, показанное в сообщении в блоге, не является полностью регулярным выражением, так как оно выполняет возврат в обратном направлении для соответствия строке.

Поскольку я никогда не использовал регулярные выражения, теперь мой вопрос:

Как я могу сразу распознать регулярное выражение из "истинного" регулярного выражения, просто взглянув на него?

Определения: Под регулярным выражением я ссылаюсь на понятие, определенное в формальных языках. Под регулярным выражением я подразумеваю понятие, поддерживаемое современными языками программирования; Синтаксис регулярного выражения часто содержит дополнительные функции, такие как обратные ссылки. Регулярные выражения в языках программирования являются строго более мощными, чем регулярные выражения в стиле формальных языков.


5
Регулярное выражение - это просто сокращение регулярного выражения. Расчет простых чисел основан на взломе Perl, а не на регулярных выражениях.

1
Это довольно просто. Обычные языки используют конкатенацию, повторение и чередование. Каждый раз, когда движок поддерживает что-то, что не эквивалентно этому, это нерегулярно.
Килиан Фот

1
Похожие вопросы: 1 , 2 , 3 .
Рафаэль

@Yannis Если ты перепрыгнешь через забор в CS, это уже не правда. Регулярные выражения в языках программирования являются строго более мощными, чем регулярные выражения (в стиле формальных языков), а условное выражение «регулярное выражение» (я не знаю, насколько оно распространено) используется для первых, а не для вторых. вид.
Рафаэль

@KilianFoth Это не очень полезное описание. Например, вы можете добавить отрицание (или, конечно, любой конечный набор булевых связок) к регулярным выражениям, не увеличивая их мощность.
Дэвид Ричерби

Ответы:


13

TL; Dr Backrefs.

Как только в \1регулярном выражении есть (или любое число, которое не используется для выхода из Юникода), оно не является регулярным выражением.

Backrefs позволяет вам найти совпадение, (a+)b\1которое соответствует n раз, aза которыми следует b, а затем n раз aдля любого n> 1. Это не обычный язык (это дочерний плакат не обычного языка).

Необходимо и почти достаточно, чтобы обратная ссылка ссылалась на группу, которая содержит регулярное выражение, совпадающее с произвольно длинной строкой, или содержащую *или +. Единственное исключение (которое я нашел) для регулярного выражения в форме, (A)B\1где A - конечный язык (может быть заменено перечислением всех слов, которые их принимают). Вы можете преобразовать это в word1+Bword1|word2+Bword2и т. Д., Потому что A конечно.

Обзорные группы не снимают регулярность регулярного выражения. A(?=B)Cсечение регулярных выражений AB.*и ACсечение двух регулярных языков является регулярным. Отрицательный взгляд аналогичен, за исключением использования дополнения B.*(обычные дополнения являются регулярными). Lookbehind точно так же, как и A(?<=B)Cсечение ACи .*BC.


Это необходимо и достаточно? Мне кажется (a)\1, что при использовании backref это эквивалентно aaи, следовательно, тривиально Regular. Я также задаюсь вопросом, могут ли утверждения с предварительным просмотром использоваться для распознавания нерегулярных языков.
MSalters

1
@MSalters: Если вы хотите получить действительно технический, (a)\1это не регулярное выражение, но распознает обычный язык.
Йорг Миттаг
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.