现代编程语言中的“正则表达式”真的是“上下文敏感语法”吗?

时间:2009-03-04 22:00:09

标签: regex idioms context-free-grammar

多年来,“正则表达式”模式匹配越来越强大,我想知道:它真的只是上下文敏感 - 语法匹配吗?它是无上下文语法匹配的变体/扩展吗?它现在在哪里,为什么我们不称之为旧的,限制性的“正则表达式”?

3 个答案:

答案 0 :(得分:11)

特别是对捕获括号的反向引用使正则表达式比常规,无上下文或上下文敏感的语法更复杂。这个名字只是在历史上成长(尽可能多的单词)。另请参阅维基百科中的this section和来自Perl的此explanation with an example

答案 1 :(得分:4)

我看待它的方式:

  • 常规语言:
    • 由国家机器匹配。只能使用一个变量来表示当前值 要匹配的语法中的“位置”:无法实现递归
  • 无上下文的语言:
    • 由堆叠机器匹配。语法中的当前“位置”由一种或另一种形式的堆栈表示。无法“记住”之前发生的任何事情
  • 上下文相关语言:
    • 大多数编程语言
    • 全部大多数人类语言

我知道正则表达式解析器,它允许你匹配解析器已经遇到的东西,实现类似上下文敏感语法的东西。

尽管如此,正则表达式解析器无论多么复杂,都不允许递归应用规则,这是无上下文语法的明确要求。

在我看来,术语 regex 主要是指用于表达那些常规语法(星号和问号)的语法

答案 2 :(得分:3)

现代正则表达式实现中的一些功能违反了classic regular expression definition的规则。

例如Microsoft’s .NET Balancing Group (?<name1-name2> … )

^(?:0(?<L>)|1(?<-L>))*(?(L)(?!))$

匹配语言 L Ο1= {ε,01,0011,000111,...}。但根据Pumping Lemma,这种语言并不常见。