Java RegEx是否不区分大小写?

Cry*_*tal 98 java regex case-sensitive

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

replaceAll("\\?i\\b(\\w+)\\b(\\s+\\1)+\\b", "$1"); 
Run Code Online (Sandbox Code Playgroud)

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

Chr*_*lma 147

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

Pattern mypattern = Pattern.compile(MYREGEX, Pattern.CASE_INSENSITIVE);
Matcher mymatcher= mypattern.matcher(mystring);
Run Code Online (Sandbox Code Playgroud)

  • 这比`(?i)'更可读,Java正则表达已经完全不可读了:S (2认同)

pol*_*nts 121

是的,可以在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
Run Code Online (Sandbox Code Playgroud)

请注意,嵌入 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

也可以看看

相关问题


cna*_*ney 108

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

"(?i)\\b(\\w+)\\b(\\s+\\1)+\\b"
Run Code Online (Sandbox Code Playgroud)


rel*_*let 23

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

Pattern.compile(regexp, Pattern.CASE_INSENSITIVE)
Run Code Online (Sandbox Code Playgroud)