Java的正则表达式引擎是否在内部优化了字符类表达式?

时间:2018-07-06 16:11:03

标签: java regex performance optimization

我们知道我们可以提出复杂的字符类,例如:

[A-F&&[^B]]     // A through F, excluding B
[G-L&&[^H]]     // G through L, excluding H

我们可以进行相交&&和联合(隐式完成):

[[A-F&&[^B]][G-L&&[^H]]]      // union of both classes above

但是问题是,Java是否会在内部生成优化的自动机,以便将上面的表达式简化为简化的表达式:

[A-L&&[^BH]]  // union of both classes above, simplified

还是不一定?我只想确定是否值得提出一些正则表达式简化例程来提高匹配性能,或者Java是否已经在隐式地简化字符类。

1 个答案:

答案 0 :(得分:0)

看看OpenJDK 12源代码,clazz method是解析字符类的地方。

完成交集的代码行为here

prev = prev.and(curr);

定义为here

default CharPredicate and(CharPredicate p) {
    return ch -> is(ch) && p.is(ch);
}

如您所见,这是一个带有简单“和”的实现。也没有代码可以稍后合并或简化这些谓词。

所以答案是:,它不会对其进行优化。

您还可以通过通过正则表达式代码进行调试来验证这一点。您可能需要逐步执行一些代码,但是最终您应该以该and实现方式结束。