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 是不是不区分大小写?的主要内容,如果未能解决你的问题,请参考以下文章
mongoose 查询 $in 不区分大小写的正则表达式不起作用