Регулярные выражения часто называют классическим примером языка, который не является завершенным. Например, «регулярные выражения» приведены в качестве ответа на этот вопрос SO в поисках языков, которые не являются полными по Тьюрингу .
В моем, возможно, несколько базовом, понимании понятия превращения полноты, это означает, что регулярные выражения не могут использоваться для проверки шаблонов, которые «сбалансированы». Сбалансированное значение имеет такое же количество открывающих символов, что и закрывающие символы. Это связано с тем, что для этого необходимо иметь какое-то состояние, позволяющее сопоставлять символы открытия и закрытия.
Однако реализация регулярных выражений в .NET вводит понятие сбалансированной группы . Эта конструкция предназначена для того, чтобы вы могли вернуться и посмотреть, была ли найдена предыдущая группа. Это означает, что регулярные выражения .NET:
^(?<p>a)*(?<-p>b)*(?(p)(?!))$
Может соответствовать шаблону, который:
ab
aabb
aaabbb
aaaabbbb
... etc. ...
Означает ли это, что регулярные выражения .NET полны по Тьюрингу? Или отсутствуют другие вещи, которые потребуются для завершения языка Тьюринга?