正则表达式 Java。为什么使用交集?

6
我从this Java正则表达式教程中学到了以下内容:

交集

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

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

如果只想匹配345,为什么不只用[345]而不是“交集”呢?这有什么用处?
提前感谢。

1
如果你有两组数字,并且想要查看一个给定的数字是否在这两个范围内,那么这将是非常有用的。为什么不会有用呢? - Darwind
5
在这种琐碎的情况下,它是没有用处的。他们只是举了一个简单的例子来说明交集的工作方式。如果您正在动态生成正则表达式,则可能会有所用处。否则,我通常发现形如[0-9&&[^45]]的示例更具代表性。 - DaoWen
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]]

我不知道具体的实现细节,但如果字符类交集/减法比使用look-around更快的话,我也不会感到惊讶。如果没有字符类操作,则look-around是最干净的替代方案。

另一个可能的用途是当您有一个预先构建的字符类,并且想要从中删除一些字符时。我遇到过一个适用于字符类交集的情况是匹配所有空格字符,但不包括换行符。

正如@beerbajay所评论的,另一个可能的用例是:

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


我认为内置的字符类是主要用例,例如[\p{InGreek}&&\p{Ll}]表示小写希腊字母。 - beerbajay
@beerbajay:你可能是对的。我还没遇到过这种用例(不过,我们是否遇到某些用例取决于我们在做什么)。 - nhahtdh
此答案已添加到Stack Overflow正则表达式FAQ,位于“字符类”。 - aliteralmind
我无法在RegexBuddy(Java或Perl版本)中使用[A-Za-z&&[^AEIOUaeiou]],也无法在Debuggex中使用任何版本。但是在Java中,Arrays.toString(Pattern.compile("[A-Za-z&&[^AEIOUaeiou]]").split("hello"))返回了预期的[, e, , , o] - aliteralmind

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