我们知道我们可以提出复杂的字符类,例如:
[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是否已经在隐式地简化字符类。
答案 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
实现方式结束。