【问题标题】:library for converting regular expressions to NFAs?用于将正则表达式转换为 NFA 的库?
【发布时间】:2010-10-18 02:05:43
【问题描述】:

有没有一个好的可以将正则表达式转换成NFA?我看到很多关于这个主题的学术论文,它们很有帮助,但对工作代码的影响不大。

我的问题部分是出于好奇,部分是由于实际需要在我正在开发的生产系统上加快正则表达式匹配。尽管为了学习而探索这个主题可能很有趣,但我不确定它是否是加速我们的模式匹配的“实用”解决方案。我们是一家 Java 商店,但很乐意提供任何语言的优质代码。

编辑

有趣的是,我不知道 Java 的正则表达式已经是 NFA。 this paper 的标题让我不相信。顺便说一句,我们目前正在 Postgres 中进行正则表达式匹配;如果简单的解决方案是将匹配移动到 Java 代码中,那就太好了。

【问题讨论】:

    标签: regex state-machine dfa nfa


    【解决方案1】:

    免责声明:我是谷歌用户,不是正则表达式专家。

    有一堆比 JDK 更快的正则表达式库,其中一个是 dk.brics.automaton。根据article 中链接的基准,它比JDK 实现快大约x20。

    这个库是由 Anders Møller 编写的,也是 mavenized

    【讨论】:

      【解决方案2】:

      免责声明:我不是 java+regex 方面的专家。但是,如果我理解正确的话……

      如果 Java 的正则表达式匹配器与大多数其他匹配器相似,它确实使用 NFA,但不是您所期望的方式。与您可能听说过的仅前向实现不同,它使用回溯解决方案来简化子表达式匹配,并且可能是反向引用使用所必需的。但是,它的交替性能很差。

      你想看:http://swtch.com/~rsc/regexp/regexp1.html(关于在这种改变的架构上表现不佳的边缘情况)。

      我还写了一个问题,我想这可以归结为同一件事:

      Regex implementation that can handle machine-generated regex's: *non-backtracking*, O(n)?

      但基本上,出于某种非常奇怪的原因,所有常见的主要供应商正则表达式实现在用于某些正则表达式时都具有糟糕的性能,即使这是不必要的。

      【讨论】:

        【解决方案3】:

        满足您加快正则表达式的需求:

        Java 对其正则表达式引擎的实现是基于 NFA 的。因此,为了调整您的正则表达式,我想说您将从对引擎实现方式的更深入了解中受益。

        因此,我指导您:Mastering Regular Expressions 这本书对 NFA 引擎及其执行匹配的方式进行了大量处理,包括如何针对 NFA 引擎调整您的正则表达式。

        此外,请查看 Atomic Grouping 以调整您的正则表达式。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-05-30
          • 2012-03-01
          • 2013-08-01
          • 1970-01-01
          • 2012-12-26
          • 2013-10-28
          • 1970-01-01
          相关资源
          最近更新 更多