用于将正则表达式转换为NFA的库?

时间:2009-04-07 14:45:09

标签: regex state-machine dfa nfa

是否有一个好的用于将正则表达式转换为 NFA ?我看到很多关于这个主题的学术论文,这些论文很有用,但对工作代码的方式并不多。

我的问题部分归因于好奇心,部分原因是为了加快我正在研究的生产系统上的正则表达式匹配的实际需要。虽然为了学习而探索这个主题可能很有趣,但我不确定它是加速模式匹配的“实用”解决方案。我们是一家Java商店,但很乐意接受任何语言的优秀代码。

修改

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

3 个答案:

答案 0 :(得分:3)

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

Java的正则表达式引擎的实现是基于NFA的。因此,为了调整你的正则表达式,我会说你可以从更深入地了解引擎的实现方式中受益。

因此我指导您:Mastering Regular Expressions本书对NFA引擎以及它如何执行匹配提供了实质性的处理,包括如何调整特定于NFA引擎的正则表达式。

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

答案 1 :(得分:1)

免责声明:我不是java + regexes的专家。但是,如果我理解正确的话......

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

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

我还写了一个问题,我想这个问题归结为同样的事情:

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

但基本上,看起来有一些非常奇怪的原因,所有常见的主要供应商正则表达式实现在某些正则表达式上都有可怕的性能,即使这是不必要的。

答案 2 :(得分:0)

免责声明:我是一名Google员工,而不是正则表达专家。

有一堆快于JDK的正则表达式库,其中一个是 dk.brics.automaton 。根据{{​​3}}中链接的基准测试,它比JDK实现快约x20。

这个图书馆是由AndersMøller编写的,也是article