Java RegEx 是不是不区分大小写?

Posted

技术标签:

【中文标题】Java RegEx 是不是不区分大小写?【英文标题】:Is Java RegEx case-insensitive?Java RegEx 是否不区分大小写? 【发布时间】:2011-03-27 01:16:50 【问题描述】:

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

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

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

【问题讨论】:

看看这个***.com/a/55980176/3593084 【参考方案1】:

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

Pattern.compile(regexp, Pattern.CASE_INSENSITIVE)

【讨论】:

感谢您的回答。这正是我一直在寻找的。在 python 中,我们有 re.IGNORECASE 在 JAVA 中寻找类似的答案。 Bit 它不适用于某些西里尔符号和德语变音符号。【参考方案2】:

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

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

【讨论】:

【参考方案3】:

是的,可以在 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" 之类的字母折叠成"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

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

另见

java.util.regex.Pattern regular-expressions.info/Modifiers 在正则表达式中指定模式 你可以用/(?i)regex/代替/regex/i(Java中的Pattern.CASE_INSENSITIVE只为正则表达式的一部分打开和关闭模式 你也可以/first(?i)second(?-i)third/ 修饰符跨度 你也可以/first(?i:second)third/ regular-expressions.info/Word Boundaries(\w\s 之间总是有一个 \b

相关问题

Can you make just part of a regex case-insensitive? Case sensitive and insensitive in the same pattern

【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案5】:

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

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

【讨论】:

这比(?i) 更易读,Java 正则表达式已经很不可读了:S

以上是关于Java RegEx 是不是不区分大小写?的主要内容,如果未能解决你的问题,请参考以下文章

Java UUID是不是区分大小写

Java UUID是不是区分大小写

java中区分大小写吗???

mongoose 查询 $in 不区分大小写的正则表达式不起作用

如何在Java中以不区分大小写的方式检查一个字符串是不是包含另一个字符串?

提高 BigQuery 不区分大小写的搜索性能