Java Regex中字符类交叉点背后的意义是什么?

时间:2009-07-09 20:53:07

标签: java regex

Java的Regex.Pattern支持以下字符类:

[a-z&&[def]]

匹配“d,e或f”,称为交叉点。

在功能上,这与以下内容没有区别:

[def]

在大型RE中更易于阅读和理解。所以我的问题是,除了在字符类上指定完全支持类似CSG的操作之外,交叉点有什么用?

(请注意,我理解[a-z&&[^bc]][a-z&&[^m-p]]等减法效用,我具体询问上面提到的交叉点。)

4 个答案:

答案 0 :(得分:4)

虽然我从来没有必要这样做,但我可以想象使用预定义的字符类,这些字符类不是彼此的正确子集(因此使得交集产生与原始的两个字符类不同的东西) 。例如。仅匹配小写拉丁字符:

[\p{Ll}&&\p{InBasicLatin}]

答案 1 :(得分:1)

我认为特定样本只是“概念证明”。两个相交的字符类仅匹配单独匹配两个字符集的字符。您提到的减法是运营商真正的实际应用。

简单地说,没有隐藏的意义。

答案 2 :(得分:1)

您可以通过编程方式在两个集合之间构建匹配的正则表达式:

String regex = String.format("[%s&&[%s]]", characterClass, whiteList);

答案 3 :(得分:1)

当一个类不是另一个类的子集时,交集很有用。有许多预定义的字符类(javadoc中给出了部分列表),特别是各种unicode块。假设对于中文使用的所有字符都有一个已定义的块,而对于日语中使用的所有字符都有一个已定义的块。有很多重叠,但两边都不完整(我不确定unicode块类是否反映了这一点)。如果只想匹配两种语言中出现的字符,可以使用两者的交集。