5

其中哪一个性能更高,或者(如果等效)哪个读得更好?我正在尝试匹配一对括号内的所有内容。

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

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

编辑

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

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

2 回答 2

5

\([^)]*\)会更快,尽管如果输入很小则不明显。当您使用[^)]*所有格时,可能会获得更好的收益:[^)]*+。这样,正则表达式引擎将不会跟踪所有字符[^)]*匹配,以防它需要回溯(在 的情况下不会发生[^)]*\))。使模式具有所有格会导致正则表达式引擎记得该模式匹配的字符。

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

*运行一些基准测试来确定!

于 2012-10-05T08:59:18.870 回答
3

p2与非贪婪方式相比,这种方式具有更好的性能,但会导致回溯。

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

看看这篇文章

于 2012-10-05T08:54:18.107 回答