为什么是模式
[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倍。
多行和不区分大小写是无关紧要的。或者操作员影响复杂性
答案 0 :(得分:2)
行。看起来我找到了答案的一半。
当我们只有像123456这样的模式时,regexp引擎使用Boyer-Moore字符串匹配算法。但是,如果你有OR然后它不使用它并简单地比较每个字符。
由于它的性质Boyer-Moore algorythm可能效率更高,所以这就是为什么第二种方法更快。
例如,如果我输入字符串“11223344”和模式“123456”,那么根据Boyer-Moore实现,唯一应检查的字符在第5位是“3”。这比尝试针对每个角色测试模式更有效。