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