在Java中,当执行replaceAll以查找正则表达式模式时:
replaceAll("\\?i\\b(\\w+)\\b(\\s+\\1)+\\b", "$1");
(删除重复的连续不区分大小写的单词,例如测试测试),我不确定我放置?i
的位置。我读到它应该在开始时,但是如果我把它取出然后我会捕获重复的连续单词(例如测试测试),但不是不区分大小写的单词(例如测试测试)。所以我想我可以在开头添加?i但似乎没有完成工作。有什么想法吗?谢谢!
答案 0 :(得分:128)
您还可以匹配不区分大小写的正则表达式,并使用Pattern.CASE_INSENSITIVE常量使其更具可读性:
Pattern mypattern = Pattern.compile(MYREGEX, Pattern.CASE_INSENSITIVE);
Matcher mymatcher= mypattern.matcher(mystring);
答案 1 :(得分:118)
是的,可以在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
/regex/i
Pattern.CASE_INSENSITIVE
(Java中为/(?i)regex/
)
/first(?i)second(?-i)third/
/first(?i:second)third/
\b
和\w
之间始终有\s
答案 2 :(得分:101)
RegexBuddy告诉我是否要在开头包含它,这是正确的语法:
"(?i)\\b(\\w+)\\b(\\s+\\1)+\\b"
答案 3 :(得分:17)
如果整个表达式不区分大小写,则只需指定CASE_INSENSITIVE
标志:
Pattern.compile(regexp, Pattern.CASE_INSENSITIVE)
答案 4 :(得分:0)
您还可以将您要检查模式匹配的初始字符串引导到小写字母。并分别在你的模式小写符号中使用。