这是正常的Java正则表达式行为吗?

时间:2011-11-25 18:24:00

标签: java regex


我在一些我希望优化的代码中找到了这个。 这是snipet:

tempString = bigBuffer.replaceAll("\\n", "");
tempString = tempString.replaceAll("\\t", "");

然后我决定明智地使用正则表达式并且我这样做了:

tempString = bigBuffer.replaceAll("[\\n\\t]", "");

然后一位朋友告诉我这样做:

tempString = bigBuffer.replaceAll("\\n|\\t", "");

由于我想知道我的更改结果,我做了一个测试来验证它是否是一个很好的优化。因此,(java版本“1.6.0_27”)的结果是第一个代码是100%的引用。

管道为121%,因此执行任务需要更多时间。

方括号为52%,因此执行任务的时间更短。

为什么正则表达式在应该相同的位置表现不同?

马丁

2 个答案:

答案 0 :(得分:4)

第一个代码片段通过bigBuffer两次查看,第一次替换新行,第二次替换选项卡。

第二个代码片段只会搜索一次bigBuffer,检查每个字符是否是一个或另一个。这将导致速度仅在一半的时间内完成。

第三个地方的代码片段可能编译得很糟糕,导致第一个代码算法的版本特别糟糕,但我没有仔细说明没有仔细检查正则表达式编译的路径。

虽然测试工作很出色。相对时间(基于百分比)是有用的,绝对时间(毫秒或某些此类)不是。

答案 1 :(得分:2)

一般来说,角色类([abc])往往比等效的替换(a|b|c)更有效,所以我不知道为什么你的朋友会建议这样做。但是在Java中,进一步优化了仅匹配Latin1指令集(即前256个Unicode代码点)中的字符的字符类。这可能就是为什么你会看到第二种和第三种技术之间存在很大差异的原因。

同样,这只是在Java中。在Perl中,我希望交替和字符类之间的差异可以忽略不计,它是一个更加成熟的实现。而且在grep中,无论你使用哪三种方法,都可能很难衡量差异 - 它只是那么快。

但是根据经验,如果您可以选择使用字符类还是替换,您应该更喜欢字符类。它可能不会更快,但绝对不会慢。如果使用不当,交替会对性能造成灾难性影响。