Java';s正则表达式引擎在内部优化字符类表达式?

Java';s正则表达式引擎在内部优化字符类表达式?,java,regex,performance,optimization,Java,Regex,Performance,Optimization,我们知道我们可以设计出复杂的字符类,例如: [A-F&&[^B]] // A through F, excluding B [G-L&&[^H]] // G through L, excluding H 我们可以进行交叉和并集(隐式完成): 但问题是,Java是否会在内部生成一个优化的自动机,从而将上面的表达式简化为一个简化的表达式: [A-L&&[^BH]] // union of both classes above, si

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

[A-F&&[^B]]     // A through F, excluding B
[G-L&&[^H]]     // G through L, excluding H
我们可以进行交叉和并集(隐式完成):

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

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

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

查看OpenJDK 12源代码,字符类就是在这里解析的

完成交叉点的代码行为:

定义如下:

正如您所看到的,它是一个带有简单“and”的实现。以后也没有代码可以合并/简化这些谓词

所以答案是:,它不会优化它们


您还可以通过正则表达式代码进行调试来验证这一点。您可能需要一步一步地完成一些代码,但最终您应该会进入
实现;后者的速度更快,但不多(在不同的情况下快2%到7%)。查看
模式#compile
,存在一些优化,但可能没有您计划的那么多。基本上,字符类总是由正则表达式egnine编译成一个“微程序”,这就是为什么它们比通过交替捕获组更快的原因。然而,你所要求的只能通过一些真正的测试来检验。只需对一个字符串执行大约5-10万次搜索,并测量所花费的时间,您就会得到结果。另一种方法是读取代码。根据java的版本和您公司的策略,这将告诉您。当然,实施可能会改变。
[A-L&&[^BH]]  // union of both classes above, simplified
prev = prev.and(curr);
default CharPredicate and(CharPredicate p) {
    return ch -> is(ch) && p.is(ch);
}