【问题标题】:Regex java. Why using intersection?正则表达式 java。为什么使用交叉点?
【发布时间】:2013-04-10 15:30:18
【问题描述】:

我取自 this oracle 的 java regex 教程,如下:

十字路口

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

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

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

提前致谢。

【问题讨论】:

  • 如果您有两组数字,并且您想查看给定数字是否在两个范围内,这将很有用。为什么没有用?
  • 在这种简单的情况下它没有用。他们只是举了一个简单的例子来说明交叉点是如何工作的。如果您是动态生成正则表达式,那么这可能很有用。否则,我通常会发现 [0-9&&[^45]] 形式的示例是更典型的用例。

标签: java regex intersection


【解决方案1】:

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

[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}] 用于小写希腊字母。

【讨论】:

  • 我认为内置字符类是主要用例,例如[\p{InGreek}&&\p{Ll}] 用于小写希腊字母。
  • @beerbajay:你可能是对的。我自己还没有遇到过那个用例(嗯,我们是否遇到一些用例取决于我们在做什么)。
  • 此答案已添加到 Stack Overflow Regular Expression FAQ 的“字符类”下。
  • 我无法让[A-Za-z&&[^AEIOUaeiou]] 在 RegexBuddy(Java 或 Perl 风格)或任何风格的 Debuggex 中工作。但在 Java 中,Arrays.toString(Pattern.compile("[A-Za-z&&[^AEIOUaeiou]]").split("hello")) 按预期返回 [, e, , , o]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-22
  • 2013-10-27
  • 2014-01-10
  • 2017-01-10
  • 1970-01-01
  • 2010-10-21
  • 1970-01-01
相关资源
最近更新 更多