Поскольку я готовлюсь к курсу обучения в колледже формальных языков, я наткнулся на эти увлекательные посты ( Один Два ), в которых описывается, как найти простое число с помощью регулярного выражения . Как я уже сказал, регулярное выражение , а не регулярное выражение . Поскольку регулярное выражение может совпадать со строками, вычисленными автоматами конечного состояния, а FSA не может найти простое число, регулярное выражение, показанное в сообщении в блоге, не является полностью регулярным выражением, так как оно выполняет возврат в обратном направлении для соответствия строке.
Поскольку я никогда не использовал регулярные выражения, теперь мой вопрос:
Как я могу сразу распознать регулярное выражение из "истинного" регулярного выражения, просто взглянув на него?
Определения: Под регулярным выражением я ссылаюсь на понятие, определенное в формальных языках. Под регулярным выражением я подразумеваю понятие, поддерживаемое современными языками программирования; Синтаксис регулярного выражения часто содержит дополнительные функции, такие как обратные ссылки. Регулярные выражения в языках программирования являются строго более мощными, чем регулярные выражения в стиле формальных языков.
источник
Ответы:
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. Я также задаюсь вопросом, могут ли утверждения с предварительным просмотром использоваться для распознавания нерегулярных языков.(a)\1
это не регулярное выражение, но распознает обычный язык.