正则表达式java。为何使用十字路口

时间:2013-04-10 15:30:18

标签: java regex intersection

我从java regex的this oracle教程中获取了以下内容:

  

交叉口

     

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

     

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

为什么它会有用?我的意思是,如果只想模仿 345 为什么不仅仅是[ 345 ]而不是“交叉点”?

提前致谢。

1 个答案:

答案 0 :(得分: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更快,我不会感到惊讶,如果字符类操作不可用,这是最干净的选择。

另一种可能的用法是当你有一个预构建的字符类,并且你想从中删除一些字符。我遇到过类交集可能适用的一个案例是匹配除新行之外的所有空白字符。

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

  

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