【问题标题】:Is "regex" in modern programming languages really "context sensitive grammar"?现代编程语言中的“正则表达式”真的是“上下文敏感语法”吗?
【发布时间】:2009-03-04 22:00:08
【问题描述】:

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

【问题讨论】:

    标签: regex idioms context-free-grammar


    【解决方案1】:

    特别是对捕获括号的反向引用使正则表达式比常规、上下文无关或上下文相关的语法更复杂。这个名字只是历史上成长的(和很多词一样)。另请参阅 Wikipedia 中的 this section 和 Perl 中的 explanation with an example。

    【讨论】:

    • 你能解释一下regular language和regular expression之间的区别吗?
    • 真的比CSG厉害吗?你能举个例子吗?
    • 正则语言可以用正则文法来描述(参见en.wikipedia.org/wiki/Regular_grammar),而正则表达式是一种模式匹配语言,限制较少,因此处理起来更复杂。
    • 感谢您的评论 notnot,我已经添加了示例链接和一些详细信息。
    • 嗯...这是否意味着我们可以使用当今的工具匹配任意 CSG。
    【解决方案2】:

    我的看法:

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

    我确实知道正则表达式解析器,它允许您匹配解析器已经遇到的内容,从而实现上下文相关语法之类的东西。

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

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

    【讨论】:

    【解决方案3】:

    现代正则表达式实现中的某些功能打破了classic regular expression definition 的规则。

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

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

    这确实匹配语言L₀₁ = {ε, 01, 0011, 000111, ... }。但是根据Pumping Lemma,这种语言是不规则的。

    【讨论】:

    • 我知道它超越了经典的正则表达式,但我想知道还有多远。上面 Fabian 的链接很有趣。
    猜你喜欢
    • 2012-03-27
    • 1970-01-01
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    • 2012-04-14
    • 2011-04-19
    • 2018-04-17
    • 2011-06-06
    相关资源
    最近更新 更多