正则表达式(正则表达式)是否经常有规律?

时间:2016-03-29 11:34:15

标签: regex grammar regular-language backreference finite-state-automaton

我理解正则表达式如何得到它们的名字,并且已经阅读了相关的问题(Why are regular expressions called "regular" expressions?),但我仍然想知道正则表达式是否总是正常的。

例如,反向引用如何定期?这不需要一些内存,因此无法通过有限状态自动机匹配/生成吗?

2 个答案:

答案 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次。我们可以证明带有反向引用系统的正则表达式满足了这个引理。