Cry*_*tal 98 java regex case-sensitive
在Java中,当执行replaceAll来查找正则表达式模式时:
replaceAll("\\?i\\b(\\w+)\\b(\\s+\\1)+\\b", "$1");
Run Code Online (Sandbox Code Playgroud)
(为了删除重复的连续不区分大小写的单词,例如测试测试),我不知道我把它放在哪里?i.我读到它应该在开头,但是如果我把它取出然后我会捕获重复的连续单词(例如测试测试),但不是不区分大小写的单词(例如测试测试).所以我想我可以在开头添加?i但似乎没有完成工作.有什么想法吗?谢谢!
Chr*_*lma 147
您还可以使用Pattern.CASE_INSENSITIVE常量匹配不区分大小写的正则表达式并使其更具可读性,如:
Pattern mypattern = Pattern.compile(MYREGEX, Pattern.CASE_INSENSITIVE);
Matcher mymatcher= mypattern.matcher(mystring);
Run Code Online (Sandbox Code Playgroud)
pol*_*nts 121
是的,可以在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
Run Code Online (Sandbox Code Playgroud)
请注意,嵌入 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
Run Code Online (Sandbox Code Playgroud)
现在假设我们指定只有在以大写字母开头时才应折叠运行.然后我们必须把它(?i)放在适当的地方:
System.out.println(
"AaAaaA eeEeeE IiiIi OoooOo uuUuUuu"
.replaceAll("\\b([A-Z])(?i)\\1+\\b", "$1")
); // A eeEeeE I O uuUuUuu
Run Code Online (Sandbox Code Playgroud)
更一般地,您可以根据需要启用和禁用模式中的任何标志.
java.util.regex.Pattern/regex/i(Pattern.CASE_INSENSITIVE在Java中),你可以做到/(?i)regex//first(?i)second(?-i)third//first(?i:second)third/\ba \w和a 之间总是存在\s)cna*_*ney 108
RegexBuddy告诉我你是否想在开头包含它,这是正确的语法:
"(?i)\\b(\\w+)\\b(\\s+\\1)+\\b"
Run Code Online (Sandbox Code Playgroud)
rel*_*let 23
如果整个表达式不区分大小写,则只需指定CASE_INSENSITIVE标志:
Pattern.compile(regexp, Pattern.CASE_INSENSITIVE)
Run Code Online (Sandbox Code Playgroud)