Java regexp OR太慢了

时间:2013-03-03 16:06:26

标签: java regex performance

为什么是模式

[0123]123456|98765

在Java中执行 123456 然后 98765 两倍慢?因此,单独搜索它们比使用OR执行要快。有人有解释吗?

UPD

查看结果的测试示例: https://gist.github.com/cy6erGn0m/5077720

UPD2

我发现原因在java.util.regex中。以下测试表明:https://gist.github.com/cy6erGn0m/5083426

因此,您可以看到Matcher对源char序列的请求显着增加。因此,第一个模式需要的源请求比两个单独的模式多2倍。

多行和不区分大小写是无关紧要的。或者操作员影响复杂性

1 个答案:

答案 0 :(得分:2)

行。看起来我找到了答案的一半。

当我们只有像123456这样的模式时,regexp引擎使用Boyer-Moore字符串匹配算法。但是,如果你有OR然后它不使用它并简单地比较每个字符。

由于它的性质Boyer-Moore algorythm可能效率更高,所以这就是为什么第二种方法更快。

例如,如果我输入字符串“11223344”和模式“123456”,那么根据Boyer-Moore实现,唯一应检查的字符在第5位是“3”。这比尝试针对每个角色测试模式更有效。