Java RegEx是否区分大小写?

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

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

(删除重复的连续不区分大小写的单词,例如testingtesting),我不知道我把它放在哪里。 我读到它应该是在开始,但是如果我把它拿出来,然后我抓住重复连续的单词(如testingtesting),但不区分大小写的话(如testingtesting)。 所以我想我可以在开始的时候添加?i,但是这似乎不能完成这项工作。 有什么想法吗? 谢谢!

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

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

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

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

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

请注意embedded的 Pattern.CASE_INSENSITIVE标志是(?i)不是\?i 。 还要注意,一个多余的\b已经从模式中删除。

(?i)放置在模式的开始处以启用不区分大小写。 在这种特殊情况下,它在模式后面不会被覆盖,所以实际上整个模式是不区分大小写的。

值得注意的是,事实上,您可以将大小写不敏感仅限于整个模式的一部分。 因此,把它放在什么地方的问题真的取决于规范(尽pipe对于这个特定的问题,这并不重要,因为\w是不区分大小写的。

为了演示,下面是一个类似"AaAaaA"字母"AaAaaA""A"例子。

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

现在假设我们指定运行只有在以大写字母开头时才能被折叠。 那么我们必须把(?i)放在适当的地方:

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

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

也可以看看

  • java.util.regex.Pattern
  • regular-expressions.info/Modifiers
    • 指定正则expression式中的模式
      • 而不是/regex/i (Java中的Pattern.CASE_INSENSITIVE ),你可以做/(?i)regex/
    • 只有正则expression式的一部分打开和closures模式
      • 你也可以/first(?i)second(?-i)third/
    • 修饰符跨度
      • 你也可以做/first(?i:second)third/
  • regular-expressions.info/Word边界 (在\w\s之间总是有一个\b

相关问题

  • 你可以只是正则expression式不区分大小写的一部分?
  • 区分大小写,不区分大小写

你也可以匹配不区分大小写的正则expression式,并通过使用Pattern.CASE_INSENSITIVE常量来使其更具可读性:

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

如果您的整个expression式不区分大小写,您可以指定CASE_INSENSITIVE标志。

http://download.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html

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