2

为什么模式

[0123]123456|98765

在 Java 中执行[0123]12345698765慢两倍?因此,单独搜索它们比使用 OR 执行更快。有人有解释吗?

UPD

请参阅带有结果的测试示例: https ://gist.github.com/cy6erGn0m/5077720

UPD2

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

如您所见,Matcher 对源字符序列发出了更多请求。所以第一个模式需要的请求比两个单独的模式多 2 倍。

多行和不区分大小写无关紧要。或运营商影响复杂性。

4

1 回答 1

2

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

当我们只有像 123456 这样的模式时,正则表达式引擎使用 Boyer-Moore 字符串匹配算法。但是如果你有 OR 那么它就不会使用它而只是比较每个字符。

由于其性质,Boyer-Moore 算法可能效率更高,因此这就是第二种方法更快的原因。

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

于 2013-03-05T17:40:14.990 回答