为什么这些正则表达式在Java中执行缓慢?

时间:2010-06-27 13:57:33

标签: java regex performance pattern-matching

我正在尝试使用正则表达式来确定用户在文本框中输入输入时应用的格式 正则表达式如下:

(\\s?[" + alphabet + "]{9,9})+

确定输入是否是给定字母表中长度为9的一个或多个字符串,可能用空格分隔。

(>[\\w\\s]+\\n[" + alphabet + "\\s]+)+

检查输入是否在FASTA format

inputString.matches(regexString)匹配时,正则表达式运行速度非常慢。这是为什么?

我认为这可能是由于Java存储了所有可能的匹配(此时我不需要),但在每个括号中添加?:会破坏正则表达式。该怎么做?

谢谢,

马丁

编辑1:我无法重现此问题 - 它只发生在一台计算机上。这可能表明该特定VM设置存在问题 我们需要更强大的东西,因此我们将以不同的方式实现这一点。我选择Joel的答案是正确的,因为我相信Pattern中的一些特殊情况可能是原因。

3 个答案:

答案 0 :(得分:1)

string.matches()每次执行时都会编译正则表达式。相反,请查看Pattern / Matcher类,它允许您缓存预编译的正则表达式。

如果您不需要匹配的结果,另一件事是使用非捕获正则表达式组。

答案 1 :(得分:1)

这可能无法解释您的特定问题。但是一旦我深入研究JDK的正则表达式实现,我就会对简单的方式感到惊讶。它并没有真正构建一个在每个输入字符处前进的状态机。我认为他们有他们的理由。

在你的情况下,手动编写解析是很容易的。人们担心这样做,手动编码这些微小的步骤似乎“愚蠢”,人们认为已建立的图书馆必须采取一些出色的技巧来超越本土解决方案。这不是真的。在许多情况下,我们的需求相当简单,DIY更简单,更快捷。

答案 2 :(得分:0)

如果您有许多不同的正则表达式模式与同一输入匹配以尝试对输入进行分类,那么您可能最好使用像JFlex这样的词法分析器生成器。

其他基于Java的词法分析器和解析工具(通常用于编译器构造)可以在here列出。