java.lang.String的replace()和replaceAll()方法有什么区别? 除了以后使用正则表达式?对于简单的替换,比如替换。用/, 有什么区别吗?


当前回答

replace()和replaceAll()都接受两个参数,并用第二个子字符串(第二个参数)替换字符串中出现的所有第一个子字符串(第一个参数)。 replace()接受一对char或charsequence, replaceAll()接受一对regex。 replace()并不比replaceAll()工作得快,因为两者在实现中使用相同的代码 Pattern.compile(正则表达式).matcher(这).replaceAll(替代);

现在的问题是什么时候使用replace,什么时候使用replaceAll()。 当你想用另一个子字符串替换一个子字符串,而不管它在字符串中的出现位置时,使用replace()。但如果你有一些特殊的偏好或条件,比如只替换字符串开头或结尾的子字符串,请使用replaceAll()。下面是一些例子来证明我的观点:

String str = new String("==qwerty==").replaceAll("^==", "?"); \\str: "?qwerty=="
String str = new String("==qwerty==").replaceAll("==$", "?"); \\str: "==qwerty?"
String str = new String("===qwerty==").replaceAll("(=)+", "?"); \\str: "?qwerty?"

其他回答

用一个例子来说明下面的代码是如何工作的:

public static void main(String[] args)
{
    String s = "My\\s aaab\\s is\\s aaab\\s name";
    String s1 = s.replace("\\s", "c");
    System.out.println(s1);
    String s2 = s.replaceAll("\\s", "c");
    System.out.println(s2);
}

输出:

Myc aaabc isc aaabc name
My\scaaab\scis\scaaab\scname

解释

s.replace将“\\s”字符序列替换为c。因此,在第一行输出。 s.s replaceall认为\\s是一个正则表达式(相当于空格),并将空格替换为c。字符串s中的\\s会被第一次遇到的\转义并变成\s。

Intellij Idea足够智能,可以通知您的使用情况。如果你仔细看看下图,你会发现Intellij对replace和replaceAll用法的解释差异。

replace()方法不使用正则表达式模式而replaceAll()方法使用正则表达式模式。因此replace()比replaceAll()执行得更快。

正如在wickeD的回答中提到的,使用replaceAll替换字符串在replace和replaceAll之间的处理方式是不同的。我期望[3]和[4]具有相同的值,但它们不同。

public static void main(String[] args) {
    String[] a = new String[5];
    a[0] = "\\";
    a[1] = "X";
    a[2] = a[0] + a[1];
    a[3] = a[1].replaceAll("X", a[0] + "X");
    a[4] = a[1].replace("X", a[0] + "X");

    for (String s : a) {
        System.out.println(s + "\t" + s.length());
    }
}

它的输出是:

\   1
X   1
\X  2
X   1
\X  2

这与perl不同,在perl中替换不需要额外的转义级别:

#!/bin/perl
$esc = "\\";
$s = "X";

$s =~ s/X/${esc}X/;
print "$s " . length($s) . "\n";

的打印 \ X 2

这可能非常麻烦,因为当尝试使用java.sql.DatabaseMetaData.getSearchStringEscape()与replaceAll()一起返回的值时。

replace适用于char数据类型,而replaceAll适用于String数据类型,两者都将第一个实参替换为第二个实参。

replace()方法被重载以同时接受基本字符和CharSequence作为参数。

现在,就性能而言,replace()方法比replaceAll()方法快一些,因为后者首先编译正则表达式模式,然后在最终替换之前进行匹配,而前者只是匹配提供的参数并进行替换。

因为我们知道正则表达式模式匹配有点复杂,因此更慢,所以建议尽可能使用replace()而不是replaceAll()。

例如,对于你提到的简单替换,最好使用:

replace('.', '\\');

而不是:

replaceAll("\\.", "\\\\");

注意:上面的转换方法参数是系统相关的。