Java Regex性能:不情愿的量词或字符类?

时间:2012-10-05 08:47:24

标签: java regex

哪一个更高效,或者(如果等效)哪个更好?我试图匹配一对括号内的所有内容。

Pattern p1 = Pattern.compile("\\([^)]*\\)");
Pattern p2 = Pattern.compile("\\(.*?\\)");

对我来说,第二个读取更好,但使用可能令人困惑的不情愿的量词,我不确定这是否会导致性能损失。

修改

不要错过表明这更好的答案:

Pattern p3 = Pattern.compile("\\([^)]*+\\)");

2 个答案:

答案 0 :(得分:4)

如果输入很小,

\([^)]*\)会更快,尽管不会引人注意。当您[^)]*占有:[^)]*+时,可能会获得更好的收益。这样,正则表达式引擎将无法跟踪所有字符[^)]*匹配,以防它需要回溯(在[^)]*\)的情况下不会发生)。使模式占有性导致正则表达式引擎记住此模式匹配的字符。

同样,这可能不明显,但如果您的输入变大(r),我很确定 * .*?[^)]*之间的差异较小而不是[^)]*[^)]*+之间。

* 运行一些基准来确定!

答案 1 :(得分:3)

与非贪婪的p2相比,这个会有更好的表现,这会导致回溯。

Pattern p1 = Pattern.compile("\\([^)]*\\)");

请看this article