JavaRegEx 不区分大小写吗?

在 Java 中,当执行 replaceAll 以查找一个 regex 模式时,如下所示:

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

(删除重复的连续不区分大小写的单词,例如测试测试) ,我不确定我把 ?i放在哪里。我读到它应该在开头,但是如果我把它拿出来,我会捕捉到重复的连续单词(例如测试测试) ,而不是不区分大小写的单词(例如测试测试)。所以我想我可以加上?我在开始,但这似乎没有得到工作完成。有什么想法吗?谢谢!

178609 次浏览

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

Pattern.compile(regexp, Pattern.CASE_INSENSITIVE)

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

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

是的,可以在 Javaregex 中随意启用和禁用不区分大小写。

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

    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

更一般地说,您可以根据自己的意愿启用和禁用模式中的任何标志。

参见

相关问题

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

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

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