在 Java 中,当执行 replaceAll 以查找一个 regex 模式时,如下所示:
replaceAll("\\?i\\b(\\w+)\\b(\\s+\\1)+\\b", "$1");
(删除重复的连续不区分大小写的单词,例如测试测试) ,我不确定我把 ?i放在哪里。我读到它应该在开头,但是如果我把它拿出来,我会捕捉到重复的连续单词(例如测试测试) ,而不是不区分大小写的单词(例如测试测试)。所以我想我可以加上?我在开始,但这似乎没有得到工作完成。有什么想法吗?谢谢!
?i
如果整个表达式不区分大小写,只需指定 CASE_INSENSITIVE标志:
CASE_INSENSITIVE
Pattern.compile(regexp, Pattern.CASE_INSENSITIVE)
RegexBuddy 告诉我,如果你想在开头包含它,这是正确的语法:
"(?i)\\b(\\w+)\\b(\\s+\\1)+\\b"
是的,可以在 Javaregex 中随意启用和禁用不区分大小写。
看起来你想要这样的东西:
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。
Pattern.CASE_INSENSITIVE
(?i)
\?i
\b
(?i)被放置在模式的开头,以支持不区分大小写。在这种特殊情况下,它不会在后面的模式中被重写,因此实际上整个模式是不区分大小写的。
值得注意的是,实际上您可以将不区分大小写限制在整个模式的某些部分。因此,把它放在哪里的问题实际上取决于规范(尽管对于这个特定的问题它并不重要,因为 \w是不区分大小写的。
\w
为了演示,这里有一个类似的例子,它将像 "AaAaaA"这样的字母序列折叠成仅仅是 "A"。
"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
/(?i)regex/
/regex/i
/first(?i)second(?-i)third/
/first(?i:second)third/
\s
你也可以把你要检查模式匹配的初始字符串引导到小写。并在您的模式中分别使用小写符号。
您还可以匹配不区分大小写的正则表达式,并通过使用 Pattern.CASE _ INSENSITIVE 常量使其更具可读性,例如:
Pattern mypattern = Pattern.compile(MYREGEX, Pattern.CASE_INSENSITIVE); Matcher mymatcher= mypattern.matcher(mystring);