Java的Regex.Pattern支持以下字符类:
[a-z&&[def]]
这个表达式匹配 "d, e 或 f",被称为交集。
从功能上讲,与以下表达式没有区别:
[def]
那么我的问题是,除了在字符类上指定对CSG类操作的完全支持之外,交集还有什么用处呢?这样做会让正则表达式更易读和理解。
(请注意,我理解像 [a-z&&[^bc]]
和 [a-z&&[^m-p]]
这样的减法的效用,我特别询问上述交集的用途。)
虽然我从未有过这样的需求,但我可以想象使用预定义字符类(它们不是彼此的真子集,因此使交集产生与原始两个字符类不同的结果)。例如,仅匹配小写拉丁字符:
[\p{Ll}&&\p{InBasicLatin}]
你可以通过编程构建两个集合之间的匹配正则表达式:
String regex = String.format("[%s&&[%s]]", characterClass, whiteList);
我相信这个示例只是一个“概念证明”。两个交叉的字符类只匹配符合两个字符集的字符。你提到的减法才是运算符的真正实际应用。
简单来说,没有隐藏的含义。
当一个类不是另一个集合的子集时,交集非常有用。有许多预定义的字符类(部分列表在javadoc中给出),特别是unicode的各种块。假设有一个定义好的块包含所有汉字使用的字符和一个包含所有日文使用的字符的块。有很大的重叠,但两侧都不完全(我不确定unicode块类是否反映了这一点)。如果您只想匹配同时出现在两种语言中的字符,则可以使用这两种语言的交集。