我理解正则表达式如何得到它们的名字,并且已经阅读了相关的问题(Why are regular expressions called "regular" expressions?),但我仍然想知道正则表达式是否总是正常的。
例如,反向引用如何定期?这不需要一些内存,因此无法通过有限状态自动机匹配/生成吗?
答案 0 :(得分:4)
您引用的问题的答案中的链接(在维基百科中),与现代编程语言提供的许多正则表达式引擎相对,后者增加了允许识别无法表达的语言的功能经典的正则表达式。
所以我要说正则表达式的演变使它摆脱了表达常规语言的原始想法。
来自Wikipedia article on regular expressions:
几乎所有现代正则表达式中都有许多功能 图书馆提供的表达能力远远超过常规 语言。例如,许多实现允许分组 带括号的子表达式并回忆它们匹配的值 相同的表达(反向引用)。这意味着,除此之外 事物,一个模式可以匹配像“爸爸”或“爸爸”这样的重复词串 “WikiWiki”,在形式语言理论中称为正方形。的模式 这些字符串是
(.+)\1
。
答案 1 :(得分:3)
现代扩展(包括反向引用)使得正则表达式系统不能成为常规语言的候选者,但IMO可以将它们提升为无上下文语言,但不能提升为图灵机。
常规语法共享一个名为pump lemma的共同属性。您可以查看示例here,它证明0 n 1 n 不是常规语法(与反向引用非常相似)。以下是如何证明反向引用不满足泵浦引理属性。
当前上下文中的抽取引理:为了表明正则表达式系统是常规语法,需要有一个有限长度p,使得与正则表达式匹配并且长度等于或大于p的所有字符串都可以被分割在xyz的三个子串中,y不是空字符串,xy * z表示的所有字符串(y泵浦为[0,无限次))与正则表达式匹配。
如果我们可以证明没有这样的p能满足正则表达式的条件那么它就不是常规语法。
对于反向引用,我们需要有两个相同长度的泵浦字符串,一个用于捕获组中的子模式,另一个用于反向引用。这正是下推自动机或无上下文语言的含义。对于无上下文语法,还有一个基于分裂成uvwxy的泵浦引理,其中v和x可以被均等地泵浦n次。我们可以证明带有反向引用系统的正则表达式满足了这个引理。