你的正则表达式([a-z])\\1{2,}
匹配 ASCII 字母并将其捕获到组 1 中,然后匹配该值的 2 次或多次出现。因此,您需要用反向引用替换所有内容,$1
,保存捕获的值。如果您使用一个$1
, the aaaaa
将被替换为单个a
如果你使用$1$1
,它将被替换为aa
.
String twoConsecutivesOnly = data.replaceAll(regex, "$1$1");
String noTwoConsecutives = data.replaceAll(regex, "$1");
See the Java演示 http://ideone.com/xt8g72.
如果您需要使正则表达式不区分大小写,请使用"(?i)([a-z])\\1{2,}"
甚至"(\\p{Alpha})\\1{2,}"
。如果必须处理任何 Unicode 字母,请使用"(\\p{L})\\1{2,}"
.
BONUS:在一般情况下,要替换任意数量的任何重复的连续字符,请使用
text = text.replaceAll("(?s)(.)\\1+", "$1"); // any chars
text = text.replaceAll("(.)\\1+", "$1"); // any chars but line breaks
text = text.replaceAll("(\\p{L})\\1+", "$1"); // any letters
text = text.replaceAll("(\\w)\\1+", "$1"); // any ASCII alnum + _ chars