在 Java regex.Pattern 中设置两个标志

Posted

技术标签:

【中文标题】在 Java regex.Pattern 中设置两个标志【英文标题】:Set two flags in Java regex.Pattern 【发布时间】:2013-08-22 07:56:45 【问题描述】:

我需要这样的匹配器:

Matcher kuchen = Pattern
        .compile("gibt es Kuchen in der K\u00FCche", Pattern.CASE_INSENSITIVE)
        .matcher("");

问题是它不是简单的ASCII。我知道在这种特殊情况下我可以使用[\u00FC\u00DC] 作为ü,但我需要更通用一点(从其他匹配器组构建正则表达式)。所以根据javadocs:

默认情况下,不区分大小写的匹配假定仅匹配 US-ASCII 字符集中的字符。可以通过将 UNICODE_CASE 标志与此标志一起指定来启用 Unicode 感知的不区分大小写匹配。

谁能告诉我如何同时指定这两个标志?

【问题讨论】:

【参考方案1】:

试试

Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE

它应该可以解决问题。对位掩码进行或运算,您将获得复合特征。

【讨论】:

在模式本身中应用标志还是在编译中使用标志参数是更好的做法,如您的答案所示? 像 Joop 的回答那样将它包含在模式中是否有任何缺点,或者它纯粹是偏好?将其包含在 Pattern 字符串中的一个潜在优点是可转移性。我的一位同事在没有设置不区分大小写标志的情况下重用了我的一个 PCRE 正则表达式,如果我将它包含在模式本身中,这不会成为问题。 @Deco 这取决于您的设计,当您应用模式或使用标志时情况可能会有所不同,但问题是关于标志的。 @Deco 将标志编译到您的模式类中更简洁,但是使用正则表达式括号问号语法可以让您更好地控制要开始和/或停止标志的位置。【参考方案2】:

虽然使用参数更纯粹,但与不带参数的"(?iu)gibt es ..." 相同。 i = 不区分大小写,u = unicode。

【讨论】:

【参考方案3】:

使用按位或,例如Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE

【讨论】:

【参考方案4】:

这是一个位掩码,因此您使用按位或运算符|

【讨论】:

以上是关于在 Java regex.Pattern 中设置两个标志的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Wildfly 中设置两只耳朵的部署顺序

在 Django 1.5/1.6 中设置两种不同类型的用户

如何使用 Swift 在 iOS 上的 UICollecetionView 中设置两张照片之间的间隔?

java.util.regex - Pattern.compile() 的重要性?

如何使用protobuf序列化java.util.regex.Pattern?

RE validation in Java EE(java.util.regex.Pattern)