正则表达式通常被指向不完全转换的语言的经典示例。例如,“正则表达式”作为此SO问题looking for languages that are not Turing complete的答案给出。
在我,或许有些基本的理解转向完整性的概念中,这意味着不能使用正则表达式来检查“平衡”的模式。平衡意义具有与结束字符相同数量的开头字符。这是因为这样做会要求你有某种状态,以便你能够匹配开始和结束的字符。
然而,正则表达式的.NET实现引入了balanced group的概念。此构造旨在让您回溯并查看先前的组是否匹配。这意味着.NET正则表达式:
^(?<p>a)*(?<-p>b)*(?(p)(?!))$
可以匹配以下模式:
ab
aabb
aaabbb
aaaabbbb
... etc. ...
这是否意味着.NET的正则表达式是图灵完整的?或者还有其他缺少的东西,这些语言需要图灵完成吗?
答案 0 :(得分:6)
在计算理论中,正则表达式描述了常规语言。常规语言类恰好是那些可被某些有限状态机识别或由常规语法生成的语言。但是,您描述的示例(平衡短语)不是常规语言,无法通过有限状态机识别或通过常规语法生成。实际上,这是一个所谓的无上下文语言的教科书示例。这些需要用于识别的下推自动机。无上下文语言类是常规语言的超集,但是是完整语言的适当子集。大多数编程语言的语法(与语义相对)是无上下文的语言。如果您有兴趣了解有关此主题的更多信息,可以从Chomsky hierarchy
开始答案 1 :(得分:5)
你几乎想念turing complete的定义。
图灵完整,以艾伦命名 图灵,每一个都很重要 合理的计算设计 到目前为止先进的设备可以模拟 通过一台通用的图灵机 - 一台 观察已被称为 Church-Turing论文。因此,一个 可以充当通用的机器 图灵机原则上可以 执行任何其他计算 可编程计算机是能够的。 但是,这与此无关 编写程序所需的努力 对于机器,它可能需要的时间 为了机器执行 计算,或任何能力 机器可能拥有不相关的机器 计算。
现在,你不能在正则表达式中做某些事情,所以langauge并不完整。
你知道,你必须像其他人一样使用相同的定义。有限的理解应该触发找出真相。
答案 2 :(得分:4)
.NET中的正则表达式并不完整,因为它们总是停止运行。这不是一般的图灵机。
答案 3 :(得分:3)
@Inuyasha:实际上你可以用正则表达式做加法。好吧至少检查计算是否正确完成。唯一的事情是你必须以一种奇怪的顺序给正则表达式输入(你不能用正则表达式反转一个字符串(或检查它是否颠倒)。
模式是:
abc
def
---
ghi
=> cfi beh adg
假设您要以二进制形式添加1011 0110:
01011
00110
-----
10001
=> 101 110 010 100 001
如果按照租约有效位的顺序将此输入设置为最大值,散布第一个操作数,第二个操作数和输出,则会得到字符串101110010100001。这可以通过
匹配((000|011|101)|(110(010|100|111)*001))*
这是一个花园品种正则表达式。你可以将它扩展为十进制加法,但正则表达式会变得疯狂复杂。