如何使用(正则表达式)删除java中重复的字母并且不区分大小写

前端之家收集整理的这篇文章主要介绍了如何使用(正则表达式)删除java中重复的字母并且不区分大小写前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我一直试图做的是用他们的小写字母(在 java中)替换任何重复的字母.例如:

我想要一个映射的函数

bob -> bob
bOb -> bob
bOOb -> bob
bOob -> bob
boOb -> bob
bob -> bob
Bob -> Bob
bOb -> bob

但是,我没有成功使用正则表达式(在Java中).

我尝试过以下方法

String regex = "([A-za-z])\\1+";
    String str ="bOob";
    Pattern pattern = Pattern.compile(regex,Pattern.CASE_INSENSITIVE);
    Matcher matcher = pattern.matcher(str);
    System.out.println(matcher.replaceAll("$1"));

但是,这会返回bOb而不是bob. (它适用于boOb).

我也尝试过:

Pattern pattern = Pattern.compile("(?i)([A-Za-z0-9])(?=\\1)",Pattern.CASE_INSENSITIVE);
        Matcher matcher = pattern.matcher(str);
        return matcher.replaceAll("");

解决了一个问题,现在bOob – >鲍勃,但带来另一个问题,因为现在它将boOb映射到bob.

注意:它还应该映射BOobOoboObOoObooOoOoOoOoOOb – > Bobobobobob.

我觉得在这一点上循环字符串并根据每个字符做一些逻辑可能更容易但我只是不想放弃使用正则表达式…如果存在使用正则表达式的解决方案,是否更多可能比循环遍历每个角色更有效?

提前致谢!

PS:我知道在传递字符串之前可以简单地降低案例,但这不是我想要的,因为它映射:

鲍勃 – >短发

解决方法

在这里使用 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()来识别匹配是否在输入的开始处,其中情况保持不变.

猜你在找的正则表达式相关文章