【问题标题】:Ruby regular expressions for recursive grammar definitions?用于递归语法定义的 Ruby 正则表达式?
【发布时间】:2013-10-22 06:27:31
【问题描述】:

如何使用正则表达式来验证递归语法定义?例如,假设我有以下语法:

阿尔法 := 伽马 | beta := delta epsilon

这只是我所说的递归定义的一个例子——我不是在寻找专门解决这个问题的正则表达式,而是更多如何用正则表达式解决这些问题。

【问题讨论】:

  • 你的语法似乎只能产生无限的单词:-)
  • 正则表达式只产生正则语言,而不是任意递归的——这可能是不可能的。检查 regular-expressions.info/recurse.html 以获取支持递归的风格。
  • @Kvass Bergi 在第一条评论中所说的是错误的。你不应该关心它。大多数现代正则表达式引擎(包括 Ruby 中采用的 Onigmo)都比正则语法强大得多。从 Ruby 1.9 开始,Ruby 的正则表达式可以处理递归。
  • @JörgWMittag 根据你刚才写的,正则表达式和 regex/regexen 之间的区别只是 Perl 社区内的一项发明,在该社区之外并不存在(Larry Wall 和一些追随者)。人们通常不会区分它们,因此,我认为区分不会有助于避免混淆。它只是增加了另一个层次的混乱。如果他们想纠正这种用法,他们应该引入一个完全不同的词,而不仅仅是“正则表达式”。无论如何,在 Ruby 的上下文中,正则表达式和正则表达式是一样的。
  • @JörgWMittag 此外,Bergi 声称可能无法进行递归,因为它是一个正则表达式。但是很明显,正则表达式的 OP 的意思是你(Perlers)称之为正则表达式的东西,因为在 Ruby 中没有你(Perlers)称之为正则表达式的东西。它具有处理递归的能力,所以我反对 Bergi 的观点是正确的,无论我们是否采用 Perlish 术语。

标签: ruby regex


【解决方案1】:

这是在 Ruby 1.9 中匹配递归模式的一种方法,在本例中是任意级别的嵌套大括号:

#!/usr/bin/env ruby

text = "... { a { b { c } b } a { d } a } ...";
match = text.match(/(?<entire>\{(?:[^{}]+|\g<entire>)*\})/).captures
puts match

将打印:

{ a { b { c } b } a { d } a }

模式的快速分解:

(?<entire>        # start named capture group called <entire>
  \{              #   match the literal '{'
  (?:             #   start non capture group 1
    [^{}]+        #     match one or more chars other than '{' and '}'
    |             #     OR
    \g<entire>    #     recursively match named group <entire>
  )*              #   end non capture group 1 and repeat it zero or more times
  \}              #   match the literal '}'
)                 # end named capture group called <entire>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-01
    • 2013-11-18
    • 1970-01-01
    • 2012-01-16
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    相关资源
    最近更新 更多