Java RegEx不区分大小写吗?


111

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

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

(以删除重复的连续的不区分大小写的单词,例如Test test),我不确定将放在哪里?i。我读到它应该是开头,但是如果我将其取出,则会捕获重复的连续单词(例如测试测试),而不是不区分大小写的单词(例如测试测试)。因此,我认为我可以在开始时添加?i,但这似乎无法完成工作。有什么想法吗?谢谢!


Answers:


119

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

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

165

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

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

2
Mmmm ....按位或运算Pattern.compile(myregex, Pattern.MULTILINE | Pattern.CASE_INSENSITIVE)

4
这比这(?i)件事更具可读性,Java正则表达式已经非常不可读:S
Bartek Banachewicz,2016年

这与4年前relet的答案是相同的答案,但得到了所有投票。奇。
Zoomzoom 19:39

@Zoomzoom,这是不是我写的:)如果你检查转租的版本历史你看到它改变了这个在2018年stackoverflow.com/posts/3436124/...
基督教Vielma

126

是的,可以在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"just 那样的字母"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

通常,您可以根据需要启用和禁用模式中的任何标志。

也可以看看

相关问题


36

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

Pattern.compile(regexp, Pattern.CASE_INSENSITIVE)

感谢你的回答。这正是我要找的。在python中,我们有re.IGNORECASE在JAVA中寻找类似的答案。
Doogle,

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.