【问题标题】:Java library for parsing regexes into an AST?用于将正则表达式解析为 AST 的 Java 库?
【发布时间】:2013-01-05 02:40:09
【问题描述】:

通常,人们会使用正则表达式将某些东西 else 解析为 AST。我正在寻找的是一种工具,可用于将正则表达式本身解析为 AST,然后我可以对其进行符号操作。假设我有一个像

这样的正则表达式
(c(o)w)/(.*?)/omg

我希望能够提出类似的问题

  • 有多少个捕获组?
  • 是否有嵌套组?
  • 字符.(正则表达式中的第 10 个字符)是否位于捕获组的开头?

并且能够以某种有意义的方式操作正则表达式,例如:

  • 获取所有命名组的名称
  • 用未命名的组替换所有命名的组
  • 将任何嵌套组展平到最外层的封闭组中

在将其序列化回字符串之前。

我已经在 java.util.regex.Pattern 附近闲逛了,但它的内部都是私有的,所以我无权访问它们。我可以使用任何第三方库来执行此操作吗?

【问题讨论】:

  • 不,你不应该使用正则表达式来“解析”除了最简单的常规语法之外的任何东西。它们被称为“正则表达式”是有原因的。
  • 没有人要求使用正则表达式来“解析”某些东西。你在说什么?
  • 我明白了,我没有仔细阅读您的问题。你想解析正则表达式,而不是用正则表达式解析。您不太可能找到一个现成的库,但实现您自己的库应该很简单。
  • 是的,我自己也得出了这个结论。我不认为自己做这件事会微不足道,但看起来这就是前进的方向......

标签: java regex parsing metaprogramming


【解决方案1】:

我会使用ANTLR 为正则表达式创建一个词法分析器/解析器。根据您要使用多少正则表达式语法,这可能很容易变得相当复杂。 Antlr 带有一个漂亮的图形编辑器,您可以在其中测试您正在创建的语法文件。生成的 AST 在标准 Java 程序中非常容易操作。如果您是 Antlr 的新手,我强烈推荐 Terence 的 Antlr 书。

【讨论】:

  • 您还可以提及 Eclipse antlrv3ide.sourceforge.net 的 ANTLR 插件。非常好的推荐(+1)
  • 我考虑过使用ANTLR;我正在使用 Scala,所以我也有可用的解析器组合器库。我的第一选择是一些已经制作好的库(如果存在的话!),因为我希望避免成为复杂正则表达式语法方面的专家来进行基本操作。
【解决方案2】:

看看我的基于 ANTLR 的 PCRE 解析器:https://github.com/bkiers/PCREParser

【讨论】:

    猜你喜欢
    • 2016-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-23
    • 1970-01-01
    • 2022-01-25
    • 2016-03-31
    相关资源
    最近更新 更多