甚至问一个有计算机科学背景的人,正则表达式是什么,答案都可能超出了有限状态自动机的限制。
例如,“正则表达式”
/^1?$|^(11+?)\1+$/
由著名的Perl个性Abigail(以及2002年以来Perl的测试套件的一部分)创建的机器描述了仅接受复合一元数的机器,但在彼得·林茨(Peter Linz)的《形式语言和自动机简介》的第三版中练习4.5(b)让读者使用该泵引理证明
不是普通语言。
在区分很重要的情况下,我们应该怎么称呼那些更严格的表达方式?
甚至问一个有计算机科学背景的人,正则表达式是什么,答案都可能超出了有限状态自动机的限制。
例如,“正则表达式”
/^1?$|^(11+?)\1+$/
由著名的Perl个性Abigail(以及2002年以来Perl的测试套件的一部分)创建的机器描述了仅接受复合一元数的机器,但在彼得·林茨(Peter Linz)的《形式语言和自动机简介》的第三版中练习4.5(b)让读者使用该泵引理证明
不是普通语言。
在区分很重要的情况下,我们应该怎么称呼那些更严格的表达方式?
Answers:
拉里·沃尔(Larry Wall)提出,对于Kleene提出的形式主义,我们使用“正则表达式”,对于广泛使用的扩展,对表达式使用“ regex”。这是一个相当广泛遵循的惯例。如果您想清楚地表明您是在用正式语言来谈论正则表达式,通常不难将其翻译成正则语言。
正则表达式的功能来自回溯,并且针对具有回溯的常规语言,已经在自动机上完成了工作。尤其请参见Becchi&Crowley,2008,扩展有限自动机以有效匹配Perl兼容的正则表达式。
这些表达式已由Aho(《理论计算机科学手册》,第A卷,第5章)和Campeanu(位于Salomaa,Yu)进行了检查(“对正规正则表达式的正式研究”,《国际计算机科学基金会》,14:1007)。 – 1018,2003),以及一些后续论文。
Campeanu等人将Aho称为更强大的表达式“ rewbr”(带有反向引用的正则表达式)。使用“扩展正则表达式”以及“实用正则表达式”。看起来,“扩展正则表达式”是最近文献中最常用的术语。
基于法语学校的“理性表达”一词,并考虑到这些表达在现实世界中使用的事实,我自己喜欢“真实表达”。
附录:我的博士学位论文中有一章涉及这类形式的语言(相应的论文将在STACS 2011上发表)。在撰写该章和论文时,我尝试了各种术语。最后,我决定对带有后向引用的模型使用扩展的正则表达式,并为好的和正常的正则表达式使用适当的正则表达式。由于更改已经完全(或大部分)撰写的论文中的术语非常烦人,我认为有些人可能对导致选择的经验感兴趣:
首先,正则表达式和rewbr并不会真正地吐舌,在整篇论文中一次又一次地使用它们会令写作和阅读感到非常疲惫,尤其是在使用任何可能的复数形式时。 类似PERL的正则表达式也很笨拙。当然,我不是母语人士,所以YMMV。
其次,一旦要谈论这两种模型,就可以方便地使用作为正则表达式变体的术语,因为这可以使人根据需要强调相似性或差异性(例如,“正则表达式,无论是适当的还是适当的,扩展”)。此外,当在整个类中谈论特殊情况时,这使人们可以轻松地强调“没有反向引用的扩展正则表达式”的特殊情况,而不是比较不同的模型。
第三,相对于新创造的术语,我更喜欢使用文学中已经使用的术语,这使我在扩展的正则表达式和实用的正则表达式之间进行选择。第二种选择暗示(至少是隐含的)正确的正则表达式在某种程度上是不切实际的,这让人觉得很奇怪(特别是Google的RE2不使用backrefs,并且看起来很实用)。
当然,此选择仅是我的“个人局部最大值”,根据需要,其他选择可能更合适。
众所周知,perl的正则表达式功能强大到足以使Turing完整。甚至有一个从普通程序到perl regexp的编译器。
因此,我怀疑为这种“正则表达式”搜索名称是否有意义。
例如查看http://search.cpan.org/~asavige/Acme-EyeDrops-1.62/lib/Acme/EyeDrops.pm
?{CODE}
指令,该指令允许模式表达式在正则表达式中插入程序代码。我知道,PCRE通常被定义为语言的“声明性”部分,整个语言称为模式语言。根据WP,Aho,1990,“用于在字符串中查找模式的算法”表明带回溯的常规语言的成员资格问题是NP完整的。声明式PCRE没有其他硬性功能。
我认为“自动机上下文中的正则表达式”的最佳术语是“理性表达”,例如在Sakarovitch的自动机理论元素或加权自动机手册中所使用的。
我们可以称它们为模式表达式。这可能会引起与模式语言的混淆,但是至少这些不常见。