【问题标题】:Rule for a regex enclosed by two /由两个 / 包围的正则表达式的规则
【发布时间】:2014-06-01 14:56:20
【问题描述】:

如何将一对 / 字符之间的所有内容与树顶匹配?我也想匹配转义的/ 字符。例如,如果我要解析“正则表达式”:

/blarg: dup\/md5 [0-9a-zA-Z]{32}/

结果会返回:

blarg: dup\/md5 [0-9a-zA-Z]{32}

【问题讨论】:

  • 我想你想从正则表达式中取出字符串。如果是这样使用/blarg: dup\/md5 [0-9a-zA-Z]{32}/.source # => "blarg: dup/md5 [0-9a-zA-Z]{32}" ..我不清楚这个问题,所以我把它放在评论本身。
  • “get”是什么意思?您想在后续操作中引用它吗?在这种情况下,将整个内容包含在 ( .. ) 中,然后您可以使用 \1 引用它
  • 只想要一个与匹配 /blarg 的树顶规则格式兼容的正则表达式:dup\/md5 [0-9a-zA-Z]{32}/
  • 这是一个有效的问题,不应被否决。

标签: ruby treetop


【解决方案1】:

这应该匹配两个 / 字符内的所有内容,包括转义的斜杠。我正在使用 Ruby 的 DATA __END__ 功能,以便所有内容都可以在单个文件中运行。

另外,请注意,您可以标记已解析表达式的某些部分,然后将它们用作函数。在下面的示例中,我标记了inside。这也可以作为elements[1] 访问,而不是被标记。

这与您可以在树顶文档中找到的matching a string 类似。

require 'treetop'
Treetop.load_from_string DATA.read

parser = RegexParser.new

puts parser.parse('/blarg: dup\/md5 [0-9a-zA-Z]{32}/').inside.text_value

# => blarg: dup\/md5 [0-9a-zA-Z]{32}

__END__
grammar Regex
   rule regex
      '/' inside:('\/' / !'/' .)* '/'
   end
end

【讨论】:

  • 如果我的语法增长不多,也会使用 DATA END 技巧。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多