5

我从这个关于 java regex 的 oracle 教程中获取了以下内容:

十字路口

要创建仅匹配所有嵌套类共有的字符的单个字符类,请使用 &&,如 [0-9&&[345]]。这个特定的交集创建了一个字符类,它只匹配两个字符类共有的数字:3、4 和 5。

输入您的正则表达式:[0-9&&[345]] 输入要搜索的输入字符串:3 我发现文本“3”从索引 0 开始,到索引 1 结束。

为什么会有用?我的意思是如果一个人只想图案化345为什么不只是 [ 345 ] 而不是“交叉点”?

提前致谢。

4

1 回答 1

4

让我们考虑一个简单的问题:匹配字符串中的英语辅音。列出所有辅音(或范围列表)是一种方法:

[B-DF-HJ-NP-TV-Zb-df-hj-np-tv-z]

另一种方法是使用环视:

(?=[A-Za-z])[^AEIOUaeiou]
(?![AEIOUaeiou])[A-Za-z]

不确定是否有任何其他方法可以在不使用字符类交集的情况下执行此操作。

字符类交集解决方案(Java):

[A-Za-z&&[^AEIOUaeiou]]

对于.NET,没有交集,但有字符类减法:

[A-Za-z-[AEIOUaeiou]]

我不知道实现细节,但如果字符类交集/减法比使用环视更快,我不会感到惊讶,如果字符类操作不可用,这是最干净的选择。

另一种可能的用法是当您有一个预先构建的字符类并且您想从中删除一些字符时。我遇到的类交集可能适用的一种情况是匹配所有空白字符,但换行符除外。

@beerbajay 评论的另一个可能的用例:

我认为内置字符类是主要用例,例如[\p{InGreek}&&\p{Ll}]小写希腊字母。

于 2013-04-10T19:53:37.337 回答