代码之家  ›  专栏  ›  技术社区  ›  Crystal

Java正则表达式不敏感吗?

  •  84
  • Crystal  · 技术社区  · 15 年前

    在Java中,当执行RePASTALL查找ReGEX模式时,如:

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

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

    5 回复  |  直到 7 年前
        1
  •  95
  •   cnanney    15 年前

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

    "(?i)\\b(\\w+)\\b(\\s+\\1)+\\b"
    
        2
  •  117
  •   Christian Vielma    11 年前

    您还可以匹配不区分大小写的regex,并通过使用pattern.case不区分大小写的常量使其更可读,例如:

    Pattern mypattern = Pattern.compile(MYREGEX, Pattern.CASE_INSENSITIVE);
    Matcher mymatcher= mypattern.matcher(mystring);
    
        3
  •  116
  •   Community Mohan Dere    8 年前

    是的,在Java ReGEX中可以启用和禁用大小写不敏感。

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

        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
    

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

    也见

    相关问题

        4
  •  14
  •   rds    7 年前

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

    Pattern.compile(regexp, Pattern.CASE_INSENSITIVE)
    
        5
  •  0
  •   Alexander Drobyshevsky    11 年前

    您还可以将初始字符串(您将检查模式匹配)引到小写。并分别在图案中使用小写符号。