在Java中使用replace和replaceAll替换连续的相同字符

时间:2015-06-16 15:33:10

标签: java string replace replaceall

我想用两者之间的标记替换所有出现的2个连续逗号(" ,,"),但我发现我无法替换第二次出现。代码如下:

String addresses = "a,,,b";
String b = addresses.replace(",,", ",EMPTYADDR,");
System.out.println(b);

我希望结果是:

a,EMPTYADDR,EMPTYADDR,b

但相反,我得到了:

a,EMPTYADDR,,b

我应该如何更改代码才能获得所需的结果?

2 个答案:

答案 0 :(得分:3)

replaceAll函数中传递基于环绕声的正则表达式。 Lookarounds不会消耗任何字符,但断言是否可以匹配。

string.replaceAll("(?<=,)(?=,)", "EMPTYADDR");

DEMO

  • (?<=,)告诉正则表达式引擎查看所有逗号。
  • (?=,)告诉正则表达式引擎匹配所有逗号之后存在的所有边界,只有它后跟另一个逗号。

  • 因此正在匹配两个边界。通过用EMPTYADDR替换匹配的边界将为您提供所需的输出。

答案 1 :(得分:3)

使用while循环的简单非正则表达式方法

public static void main(String[] args) {
    String addresses = "a,,,b";
    while (addresses.contains(",,")){
        addresses = addresses.replace(",,", ",EMPTYADDR,");
    }
    System.out.println(addresses);
}

结果:

a,EMPTYADDR,EMPTYADDR,b

您也可以拆分字符串,填充空元素,然后使用String.join()重建

public static void main(String[] args) {
    String addresses = "a,,,b";
    String[] pieces = addresses.split(",");
    for (int i = 0; i < pieces.length; i++) {
        if (pieces[i].isEmpty()) {
            pieces[i] = "EMPTYADDR";
        }
    }

    addresses = String.join(",", pieces);
    System.out.println(addresses);
}