为什么递归正则表达式不是正则表达式?

时间:2010-02-12 22:01:03

标签: regex recursion pcre

我正在阅读this问题中的一些回复,并看到有些人说递归正则表达式严格来说不是正则表达式。

为什么会这样?

4 个答案:

答案 0 :(得分:17)

“严格”正则表达式描述regular languages。但是许多功能,例如表达式本身的反向引用或例如递归,可用于编写接受非常规语言的正则表达式。

例如,

描述的语言
(a+)b+\1

不常规,因为您无法强制ab之前和之后出现相同的次数。至少不是常规语言。使用无上下文或甚至是上下文相关的语言,这是完全不同的事情。

但是,正则表达式只使用基本的东西,如各种量词,字符类等。通常仍然描述常规语言。

答案 1 :(得分:15)

有限自动机可以识别所有常规语言。有限自动机具有有限数量的状态,因此具有有限的存储器(因此得名)。递归的“常规”表达式需要一个潜在的无限堆栈空间来进行递归,因此无法使用有限自动机识别它,因此它不是常规的。

答案 2 :(得分:10)

理论计算机科学对常规语言的严格定义似乎是抽象的,几乎没有实际的好处,但是如果你曾经面临过需要实现状态机来识别某些输入,那么你可以节省很多无用的工作量。如果你能事先证明它是无法完成的,那就是去掉头发。

表达它的一种非正式方式是识别常规语言不能要求任意数量的记忆。 pumping lemma for regular languages对于证明确定性有限自动机无法识别特定语言(,一组字符串)非常有用。

来自An Introduction to Formal Languages and Automata的Peter Linz(第115页,第3版):

  

定理4.8

     

L 成为无限的常规语言。然后存在一些正整数 m ,这样任何 w L 与| w | ≥ m 可以分解为

     
    

w = xyz

  
     

     
    

| XY | ≤ m

  
     

     
    

| ý | ≥1,

  
     

这样

     
    

w i = xy i z - Eq。 (4.2)

  
     对于所有 i = 0,1,2,......

也在 L

为了识别无限语言,有限自动机必须“抽”或重复某些部分状态,这就是 y i 的功能(某些字符串的符号) y 重复 i 次。)

几乎所有涉及泵浦引理的证据都涉及矛盾证据。在页117,作者证明语言 L = { a n b n n ≥0} - ie ,形式为 aaa ... bbb ... 的字符串,其中all- a 和all- b 子串长度相等 - 不规则:

  

假设 L 是规则的,因此泵浦引理必须保持。我们不知道 m 的价值,但不管它是什么,我们总是可以选择 n = m 。因此,子字符串 y 必须完全由 a 组成。假设| y | = k 。然后,通过使用等式(4.2)中的 i = 0获得的字符串是

     
    

w 0 = a m-k b m

  
     

并且显然不在 L 中。这与泵浦引理相矛盾,从而表明 L 是规则的假设必须是假的。

非常规语言的其他示例:

  • L = { ww R w ∈Σ * } - ie ,palindromes
  • L = { w ∈Σ * n a (< i> w )&lt; n b w )} - a 的数量少于 b 的数量
  • L = { a n! n ≥0}
  • L = { a n b l n l }
  • L = { a n b l n + l 是素数}

事实证明,我们松散地调用正则表达式的功能要强大得多:将正则表达式与反向引用匹配为NP-hard

答案 3 :(得分:4)

其他答案的基础需要理解所涉及的计算理论。如果您只接触正则表达式是在编程环境中,那么您可能也没有意识到正则表达式也是数学结构。关于regular expressions的维基百科文章可能会提供正则表达式理论方面的一些背景知识。