答案 0 :(得分:25)
排除任何类型的嵌入代码,例如?{ }
,它们可能无法涵盖所有无上下文,更不用说图灵机了。他们可能,但据我所知,没有人真正以某种方式证明这一点。鉴于人们一直在尝试使用Perl正则表达式来解决某些无上下文的问题并且还没有提出解决方案,因此它们很可能不是无上下文的。
有一个有趣的讨论,关于哪些特征仅仅是方便的,哪些实际上增加了力量。例如,匹配0 n * 1 * 0 n (这是“任意数量的零,后跟一个,后跟与之前相同的零数”的表示法“ )不是纯正的正则表达式可以完成的事情。您可以使用Pumping Lemma证明这不能用正则表达式完成,但简单,非正式的证据是正则表达式必须计算任意数量的零,并且正则表达式不能进行计数。
但是,反向引用可以与以下内容匹配:
/(0*) 1 \1/x;
这意味着反向引用会给你更多力量,而不仅仅是方便。还有什么可以给我们更大的力量,我想知道?
另外,Perl6“模式”(它们甚至不再假装它们是正则表达式)的设计看起来有点像Perl5正则表达式(所以你不需要重新学习很多),但它们有足够的功能添加到完全没有背景。它们实际上是经过精心设计的,因此您可以使用它们来改变在词法范围内解析语言的方式。
答案 1 :(得分:16)
至少有两个讨论:Turing completeness and regular expressions和Are Perl patterns universal?以及进一步的参考。
对于我未经训练的人来说,共识似乎是答案是“不”,但我不确定我是否理解正确。
答案 2 :(得分:6)
对于Perl中的正则表达式,有两种情况:
regular language可以接受finite automaton。它的输入必须是有限的字符串。
[...] a 确定性有限自动机(DFA) - 也称为确定性 有限状态机 - 是接受/拒绝的有限状态机 有限的符号串[...]。
Turing machines同样如此:正式定义甚至没有输入。它必须以有限数量的状态编码。
Alternative (equivalent) definitions include input, but it must be finite.