正则表达式不是


36

甚至问一个有计算机科学背景的人,正则表达式是什么,答案都可能超出了有限状态自动机的限制。

例如,“正则表达式”

/^1?$|^(11+?)\1+$/

由著名的Perl个性Abigail(以及2002年以来Perl的测试套件的一部分)创建的机器描述了仅接受复合一元数的机器,但在彼得·林茨(Peter Linz)的《形式语言和自动机简介》的第三版中练习4.5(b)让读者使用该泵引理证明

L={an:n is not a prime number}

不是普通语言。

在区分很重要的情况下,我们应该怎么称呼那些更严格的表达方式?

Answers:


46

拉里·沃尔(Larry Wall)提出,对于Kleene提出的形式主义,我们使用“正则表达式”,对于广泛使用的扩展,对表达式使用“ regex”。这是一个相当广泛遵循的惯例。如果您想清楚地表明您是在用正式语言来谈论正则表达式,通常不难将其翻译成正则语言。

正则表达式的功能来自回溯,并且针对具有回溯的常规语言,已经在自动机上完成了工作。尤其请参见Becchi&Crowley,2008,扩展有限自动机以有效匹配Perl兼容的正则表达式


5
我同意,“ Perl regex”(“ POSIX regex”等)与“常规语言”之类的内容应足够清楚,以防止出现任何误解的可能性。
Jukka Suomela

Perl正则表达式不仅具有回溯功能,还具有许多其他功能。
reinierpost

@reinierpost是的,但是从正式语言的角度来看,回溯是最重要的。Perl正则表达式具有执行任意Perl代码的功能,但我认为正则表达式应宽松地解释为涵盖PCRE。PCRE包含诸如递归模式之类的怪异事物,但这是一门黑暗的艺术,使您远远超出了常规语言的范畴。不过,我可以更新我的答案以涵盖这些内容。
查尔斯·斯图尔特

18

这些表达式已由Aho(《理论计算机科学手册》,第A卷,第5章)和Campeanu(位于Salomaa,Yu)进行了检查(“对正规正则表达式的正式研究”,《国际计算机科学基金会》,14:1007)。 – 1018,2003),以及一些后续论文。

Campeanu等人将Aho称为更强大的表达式“ rewbr”(带有反向引用的正则表达式)。使用“扩展正则表达式”以及“实用正则表达式”。看起来,“扩展正则表达式”是最近文献中最常用的术语。

基于法语学校的“理性表达”一词,并考虑到这些表达在现实世界中使用的事实,我自己喜欢“真实表达”。

附录:我的博士学位论文中有一章涉及这类形式的语言(相应的论文将在STACS 2011上发表)。在撰写该章和论文时,我尝试了各种术语。最后,我决定对带有后向引用的模型使用扩展的正则表达式,并为好的和正常的正则表达式使用适当的正则表达式。由于更改已经完全(或大部分)撰写的论文中的术语非常烦人,我认为有些人可能对导致选择的经验感兴趣:

首先,正则表达式rewbr并不会真正地舌,在整篇论文中一次又一次地使用它们会令写作和阅读感到非常疲惫,尤其是在使用任何可能的复数形式时。 类似PERL的正则表达式也很笨拙。当然,我不是母语人士,所以YMMV。

其次,一旦要谈论这两种模型,就可以方便地使用作为正则表达式变体的术语,因为这可以使人根据需要强调相似性或差异性(例如,“正则表达式,无论是适当的还是适当的,扩展”)。此外,当在整个类中谈论特殊情况时,这使人们可以轻松地强调“没有反向引用的扩展正则表达式”的特殊情况,而不是比较不同的模型。

第三,相对于新创造的术语,我更喜欢使用文学中已经使用的术语,这使我在扩展的正则表达式实用的正则表达式之间进行选择。第二种选择暗示(至少是隐含的)正确的正则表达式在某种程度上是不切实际的,这让人觉得很奇怪(特别是Google的RE2不使用backrefs,并且看起来很实用)。

当然,此选择仅是我的“个人局部最大值”,根据需要,其他选择可能更合适。


7
不幸的是,术语POSIX已经采用了扩展正则表达式,它区分了基本正则表达式(BRE)扩展正则表达式(ERE),这两种扩展正则表达式根据您的定义都是扩展正则表达式。
约尔格W¯¯米塔格

@Jörg:实际上,根据这个事实,扩展和基本POSIX正则表达式都没有比正则表达式更强大。而且,纯(非GNU)BRE实际上不如正则表达式强大(缺少交替运算符)。
sepp2k 2010年

有关此“ rewbr”的最新结果,请参见Carle和Narendran(2009)的“关于扩展正则表达式”:portal.acm.org/citation.cfm?id=1533235
Jakob,

该语言类的其他最新结果:Campeanu和Santean撰写的“关于正则表达式语言与常规语言的交汇”(TCS 410,2009)Reidenbach和Schmid撰写的“大型扩展正则表达式的多项式时间匹配测试”(CIAA 2010) )和“扩展的正则表达式:简洁性和可判定性”(本人,应于STACS 2011上发表)。
2011年

6

众所周知,perl的正则表达式功能强大到足以使Turing完整。甚至有一个从普通程序到perl regexp的编译器。

因此,我怀疑为这种“正则表达式”搜索名称是否有意义。

例如查看http://search.cpan.org/~asavige/Acme-EyeDrops-1.62/lib/Acme/EyeDrops.pm



5
@András:我认为Arthur在谈论Perl的?{CODE}指令,该指令允许模式表达式在正则表达式中插入程序代码。我知道,PCRE通常被定义为语言的“声明性”部分,整个语言称为模式语言。根据WP,Aho,1990,“用于在字符串中查找模式的算法”表明带回溯的常规语言的成员资格问题是NP完整的。声明式PCRE没有其他硬性功能。
查尔斯·斯图尔特

我添加了链接;我没有看源代码,所以我真的不知道它是如何工作的,是否有任何证据证明编译是正确的。
Arthur MILCHIOR 2010年

1
抱歉,但是根据您的说法,由于lambda演算是图灵完备的,因此没有必要为其寻找名称。所有其他图灵完备的计算形式和语言都相同。更重要的是,图灵完备性不能描述语言的表达能力,因此仅凭语言是图灵完备性来识别语言是没有意义的。我关于lambda演算的例子是一个极端的例子。
Blaisorblade 2010年


1

给出其他答案,我建议“常规语言”是安全的,并且在简要说明了区别之后,再谈谈正则表达式的“实用正则表达式”(带有回溯)。

还要注意,作为正则表达式和实用表达式的同一个正则表达式可以具有不同的语义,因为在后一种情况下,语义是根据回溯定义的,因此结果不同。详细信息将不合时宜,但是如果您提出其他问题(也许是SO而不是此处的dunno),我会回答,并通过评论通知我。


0

我们可以称它们为模式表达式。这可能会引起与模式语言的混淆,但是至少这些不常见。


2
原则上,我同意您的推理,但是Campeanu,Santean和Yu已经使用术语模式表达式来表示具有“更清洁”定义的类似语言类别(请参阅《模式表达式和模式自动机》,IPL 92(2004 )
Dominik D. Freydenberger
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.