Answers:
RegexBuddy告诉我是否要在开始时包含它,这是正确的语法:
"(?i)\\b(\\w+)\\b(\\s+\\1)+\\b"
您还可以匹配不区分大小写的正则表达式,并使用Pattern.CASE_INSENSITIVE常量使其更具可读性,例如:
Pattern mypattern = Pattern.compile(MYREGEX, Pattern.CASE_INSENSITIVE);
Matcher mymatcher= mypattern.matcher(mystring);
Pattern.compile(myregex, Pattern.MULTILINE | Pattern.CASE_INSENSITIVE)
(?i)
件事更具可读性,Java正则表达式已经非常不可读:S
是的,可以在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"
just 那样的字母"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
和之间始终存在a \s
)如果整个表达式不区分大小写,则只需指定该CASE_INSENSITIVE
标志即可:
Pattern.compile(regexp, Pattern.CASE_INSENSITIVE)
您还可以将要检查模式匹配的初始字符串转为小写。并在您的模式中分别使用小写字母符号。