Java的正则表达式中,字符类交集有什么作用?

11

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

[a-z&&[def]]

这个表达式匹配 "d, e 或 f",被称为交集。

从功能上讲,与以下表达式没有区别:

[def]

那么我的问题是,除了在字符类上指定对CSG类操作的完全支持之外,交集还有什么用处呢?这样做会让正则表达式更易读和理解。

(请注意,我理解像 [a-z&&[^bc]][a-z&&[^m-p]] 这样的减法的效用,我特别询问上述交集的用途。)

4个回答

4

虽然我从未有过这样的需求,但我可以想象使用预定义字符类(它们不是彼此的真子集,因此使交集产生与原始两个字符类不同的结果)。例如,仅匹配小写拉丁字符:

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

也许吧,但是上述正则表达式的结果与 [\p{Lower}] 没有任何区别,因为根据定义,\p{Lower} 只包括默认字母表中的小写字母。如果你的默认字母表不是拉丁字母,则该正则表达式实际上将匹配不到任何内容。 - Christopher
将\p{Lower}更改为\p{Ll}以避免默认字母表问题。 - iammichael

1

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

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

这在理论上有些道理,但你能举一个实际的例子来说明它吗? - Christopher

1

我相信这个示例只是一个“概念证明”。两个交叉的字符类只匹配符合两个字符集的字符。你提到的减法才是运算符的真正实际应用。

简单来说,没有隐藏的含义。


1

当一个类不是另一个集合的子集时,交集非常有用。有许多预定义的字符类(部分列表在javadoc中给出),特别是unicode的各种块。假设有一个定义好的块包含所有汉字使用的字符和一个包含所有日文使用的字符的块。有很大的重叠,但两侧都不完全(我不确定unicode块类是否反映了这一点)。如果您只想匹配同时出现在两种语言中的字符,则可以使用这两种语言的交集。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接