【发布时间】:2011-06-17 15:52:07
【问题描述】:
正则表达式通常被认为是不完善的语言的经典示例。例如,“正则表达式”作为这个 SO 问题looking for languages that are not Turing complete 的答案给出。
在我对转向完整性概念的理解中,这可能是一些基本的理解,这意味着不能使用正则表达式来检查“平衡”的模式。平衡的含义具有与结束字符相同数量的开始字符。这是因为这样做需要你有某种状态,以允许你匹配开始和结束字符。
然而,正则表达式的 .NET 实现引入了balanced group 的概念。此构造旨在让您回溯并查看之前的组是否匹配。这意味着一个 .NET 正则表达式:
^(?<p>a)*(?<-p>b)*(?(p)(?!))$
可以匹配以下模式:
ab
aabb
aaabbb
aaaabbbb
... etc. ...
这是否意味着.NET 的正则表达式是图灵完备的?或者是否还有其他缺少的东西需要语言是图灵完备的?
【问题讨论】:
-
对,Turing Completeness的定义;-)
-
好吧,我对这个有点兴奋,这实际上意味着它们可以匹配非常规语言,根据维基百科,这对于正则表达式语法并不少见。 “'正则表达式' [...] 与真正的正则表达式关系不大”:en.wikipedia.org/wiki/…
-
.NET 确实非常强大。它甚至具有可变长度后视功能。
-
可变长度后视和前瞻对正则表达式没有任何作用。
-
@JustinMorgan:谈论一种语言的 power 通常意味着考虑需要什么样的自动机将语言与字符串匹配,以及带有前瞻/后视的正则表达式不需要比普通正则表达式更多的东西——DFA 或 NFA。您总是可以将带有环视的正则表达式重写为没有环视的正则表达式,但它可能会增长很多——带有环视的正则表达式比普通正则表达式更具表现力,因为它们允许您用少很多。 (匹配提取是另一回事 - 如果没有它们,您将无法获得与 "(?
标签: .net regex computer-science turing-machines turing-complete