3

是否有将正则表达式转换为NFA的好?我看到很多关于该主题的学术论文,这些论文很有帮助,但对工作代码的影响不大。

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

编辑

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

4

3 回答 3

3

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

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

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

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

于 2009-04-07T14:54:01.080 回答
1

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

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

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

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

可以处理机器生成的正则表达式的正则表达式实现:*非回溯*,O(n)?

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

于 2009-07-25T13:13:06.627 回答
0

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

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

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

于 2013-09-20T08:55:43.887 回答