Java的Regex.Pattern支持以下字符类:
[a-z&&[def]]
匹配“d,e或f”,称为交叉点。
在功能上,这与以下内容没有区别:
[def]
在大型RE中更易于阅读和理解。所以我的问题是,除了在字符类上指定完全支持类似CSG的操作之外,交叉点有什么用?
(请注意,我理解[a-z&&[^bc]]
和[a-z&&[^m-p]]
等减法效用,我具体询问上面提到的交叉点。)
答案 0 :(得分:4)
虽然我从来没有必要这样做,但我可以想象使用预定义的字符类,这些字符类不是彼此的正确子集(因此使得交集产生与原始的两个字符类不同的东西) 。例如。仅匹配小写拉丁字符:
[\p{Ll}&&\p{InBasicLatin}]
答案 1 :(得分:1)
我认为特定样本只是“概念证明”。两个相交的字符类仅匹配单独匹配两个字符集的字符。您提到的减法是运营商真正的实际应用。
简单地说,没有隐藏的意义。
答案 2 :(得分:1)
您可以通过编程方式在两个集合之间构建匹配的正则表达式:
String regex = String.format("[%s&&[%s]]", characterClass, whiteList);
答案 3 :(得分:1)
当一个类不是另一个类的子集时,交集很有用。有许多预定义的字符类(javadoc中给出了部分列表),特别是各种unicode块。假设对于中文使用的所有字符都有一个已定义的块,而对于日语中使用的所有字符都有一个已定义的块。有很多重叠,但两边都不完整(我不确定unicode块类是否反映了这一点)。如果只想匹配两种语言中出现的字符,可以使用两者的交集。