(转载)Java中String类replace和replaceAll的区别

原文链接> https://yutuo.net/archives/f0e50f49064b4a00.html


在Java中replace和replaceAll算是字符串函数中用得比较多的方法。之前我也不太明白两者的区别,直到把正则表达式理解到了一定的程度,才发现两者区别还是比较大的。

其两者的函数声明部分如下:

Java
public String replace(char oldChar, char newChar)
public String replace(CharSequence target, CharSequence replacement)

public String replaceAll(String regex, String replacement)

下面可以看看两者的区别:

1. 参数不同
replace函数接受字符和有CharSequence接口的实例做为参数
CharSequence接口的比较常用的实现有String StringBuilder StringBuffer。
replaceAll函数只接受字符串做为参数。

2. 实现的功能不同。
replace函数只实现简单的替换功能。
replaceAll函数实现了正则表达式替换功能。

3. 用途不同
replace函数一般用于基本的替换。
replaceAll函数一般用于比较高级的替换。比如把所有数字替换成*号,如果用replace就要写循环语句了,但replaceAll(“\d”, “*”)就实现了。再比如要把字符串里三个连续相同的字符替换成***,用replace实现是很难的。但replaceAll(“(.)\\1\\1”, “***”)一句就实现。当然要想用好replaceAll函数,就必须好好的学学正则表达式。

要注意的地方:
replaceAll函数的第一个参数是正则表达式,所以要满足正则表达式的写法。第二个参数里是有转义符的,其$符号表示正则表达式匹配的组,\表示转义符。

之前有一个项目,在replace和replaceAll之间出了一个bug,要实现把井号(#)替换成两个斜线(\\),一同事把代码写成的str.replaceAll(“#”, “\\\\”),每次看代码都觉得代码是写对了的,但结果却只是把井号(#)替换成一个斜线(\)。查了半天才查出原因,原来是replaceAll和replace用错了。

上面提到的一些代码如下,你也可以自己试试

public class Test {
    public static void main(String[] arg) {
        // 把(a)替换成*a*
        String str = "(a)TEST String";
        System.out.println(str.replace("(a)", "*a*"));
        System.out.println(str.replaceAll("(a)", "*a*"));

        // 把所有数字替换成*号
        str = "1ads12dfad";
        System.out.println(str.replaceAll("\\d", "*"));

        // 把字符串里三个连续相同的字符替换成***
        str = "adddadfegggllld";
        System.out.println(str.replaceAll("(.)\\1\\1", "***"));

        // 把井号(#)替换成两个斜线(\\) ※BUG
        str = "a#b";
        System.out.println(str.replaceAll("#", "\\\\"));
    }
}

上面的代码结果如下:

*a*TEST String
(*a*)TEST String
*ads**dfad
a***adfe******d
a\b

转载请注明:宇托的狗窝 » Java中String类replace和replaceAll的区别

你可能感兴趣的:(java,java)