在Java正则表达式中设置两个标志

39

我需要一个像这样的匹配器:

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

问题在于它不是简单的ASCII码。我知道在这种特定情况下,我可以使用[\u00FC\u00DC]来表示ü,但我需要更通用的方式(从其他匹配器组构建正则表达式)。所以根据Javadocs

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

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

4个回答

56

尝试

Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE

它应该解决这个问题。通过对位掩码执行或运算,您将获得复合功能。


在您的回答中,是将标志应用于模式本身还是使用编译中的标志参数更好的做法? - Declan McKenna
将其包含在模式中,例如Joop的答案中那样,是否存在任何缺点,还是纯粹出于个人喜好?将其包含在Pattern字符串中的一个潜在优点是可移植性。我的一位同事重用了我其中一个PCRE正则表达式,但没有设置不区分大小写标志,如果我将其包含在模式本身中,这将不会成为问题。 - Declan McKenna
@Deco 这取决于你的设计,当你应用模式或使用标志时情况可能会有所不同,但问题是关于标志的。 - Roman C
@Deco 把标志编译到模式类中更整洁,但使用正则表达式括号问号语法可以更好地控制您想要开始和/或停止标志的位置。 - Victor Grazi

15

虽然使用参数更加纯净,与没有参数的"(?iu)gibt es ..."相同。i表示不区分大小写,u表示unicode。


11
使用按位或(bitwise OR)操作,例如 Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE

8

这是一个位掩码,所以你需要使用按位或运算符|


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