Java RegEx是否不区分大小写?

时间:2010-08-08 21:21:09

标签: java regex case-sensitive

在Java中,当执行replaceAll以查找正则表达式模式时:

replaceAll("\\?i\\b(\\w+)\\b(\\s+\\1)+\\b", "$1"); 

(删除重复的连续不区分大小写的单词,例如测试测试),我不确定我放置?i的位置。我读到它应该在开始时,但是如果我把它取出然后我会捕获重复的连续单词(例如测试测试),但不是不区分大小写的单词(例如测试测试)。所以我想我可以在开头添加?i但似乎没有完成工作。有什么想法吗?谢谢!

5 个答案:

答案 0 :(得分:128)

您还可以匹配不区分大小写的正则表达式,并使用Pattern.CASE_INSENSITIVE常量使其更具可读性:

Pattern mypattern = Pattern.compile(MYREGEX, Pattern.CASE_INSENSITIVE);
Matcher mymatcher= mypattern.matcher(mystring);

答案 1 :(得分:118)

是的,可以在Java正则表达式中随意启用和禁用不区分大小写。

看起来你想要这样的东西:

    System.out.println(
        "Have a meRry MErrY Christmas ho Ho hO"
            .replaceAll("(?i)\\b(\\w+)(\\s+\\1)+\\b", "$1")
    );
    // Have a meRry Christmas ho

请注意,嵌入式 Pattern.CASE_INSENSITIVE标记为(?i)而不是\?i。另请注意,已从模式中删除了一个多余的\b

(?i)位于模式的开头,以启用不区分大小写。在这种特殊情况下,它不会在模式中稍后重写,因此实际上整个模式不区分大小写。

值得注意的是,实际上您可以将不区分大小写的内容仅限于整个模式的一部分。因此,放置它的位置的问题实际上取决于规范(尽管对于这个特定的问题,它并不重要,因为\w不区分大小写。

为了演示,以下是将"AaAaaA"等字母折叠到"A"的类似示例。

    System.out.println(
        "AaAaaA eeEeeE IiiIi OoooOo uuUuUuu"
            .replaceAll("(?i)\\b([A-Z])\\1+\\b", "$1")
    ); // A e I O u

现在假设我们指定只有在以大写字母开头时才应折叠运行。然后我们必须将(?i)放在适当的位置:

    System.out.println(
        "AaAaaA eeEeeE IiiIi OoooOo uuUuUuu"
            .replaceAll("\\b([A-Z])(?i)\\1+\\b", "$1")
    ); // A eeEeeE I O uuUuUuu

更一般地说,您可以根据需要启用和禁用模式中的任何标记。

另见

相关问题

答案 2 :(得分:101)

RegexBuddy告诉我是否要在开头包含它,这是正确的语法:

"(?i)\\b(\\w+)\\b(\\s+\\1)+\\b"

答案 3 :(得分:17)

如果整个表达式不区分大小写,则只需指定CASE_INSENSITIVE标志:

Pattern.compile(regexp, Pattern.CASE_INSENSITIVE)

答案 4 :(得分:0)

您还可以将您要检查模式匹配的初始字符串引导到小写字母。并分别在你的模式小写符号中使用。