在这里使用
Matcher#group()而不是$1
if (matcher.find()) {
System.out.println(matcher.replaceAll(matcher.group(1)
.toLowerCase()));
}
让您使用toLowerCase()然后.
编辑:(回应OP的评论)
Matcher#group(n)与$n相同 – 它指的是第n个捕获组.因此,group(1)和$1都捕获O,除了您可以将捕获切换到LowCase().
循环由replaceAll()运行,而不是由find()运行. Matcher#find()是初始化组所必需的,因此group(1)在调用replaceAll()之前返回捕获.
但是,这也意味着捕获保持不变,满足您的要求,但需要重置匹配器,如BOobbOobboObbOoObbooOoOoOoOoOOb(注意双b).循环必须由Mathcer#find()驱动,这意味着replaceAll()与replaceFirst()进行交易.
String regex = "([A-Za-z])\\1+";
String str = "BOobbOobboObbOoObbooOoOoOoOoOObb";
Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
str = matcher.replaceFirst(matcher.start() > 0 ? matcher.group(1)
.toLowerCase() : matcher.group(1));
matcher.reset(str);
}
System.out.println(str); // Bobobobobob
这里使用Matcher#start()来识别匹配是否在输入的开始处,其中情况保持不变.