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


当前回答

为了添加到已经选择的“最佳答案”(以及其他像Suragch的一样好的答案),String.replace()被限制为替换顺序字符(因此接受CharSequence)。但是,String.replaceAll()不受仅替换顺序字符的约束。只要正则表达式以这种方式构造,就可以替换非顺序字符。

此外(最重要也是最明显的),replace()只能替换文字值;而replaceAll可以替换“like”序列(不一定相同)。

其他回答

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

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

老线程我知道,但我对Java有点陌生,发现其中一件奇怪的事情。我已经使用了String.replaceAll(),但得到了不可预知的结果。

像这样的东西会把字符串弄乱:

sUrl = sUrl.replaceAll( "./", "//").replaceAll( "//", "/");

所以我设计了这个函数来解决这个奇怪的问题:

//String.replaceAll does not work OK, that's why this function is here
public String strReplace( String s1, String s2, String s ) 
{
    if((( s == null ) || (s.length() == 0 )) || (( s1 == null ) || (s1.length() == 0 )))
     { return s; }

   while( (s != null) && (s.indexOf( s1 ) >= 0) )
    { s = s.replace( s1, s2 ); }
  return s;
}

这使你能够做到:

sUrl=this.strReplace("./", "//", sUrl );
sUrl=this.strReplace( "//", "/", sUrl );

正如在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()一起返回的值时。

在Java 9中,对替换方法进行了一些优化。

在Java 8中,它使用正则表达式。

public String replace(CharSequence target, CharSequence replacement) {
    return Pattern.compile(target.toString(), Pattern.LITERAL).matcher(
            this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
}

Java 9及以上版本。

和Stringlatin实现。

它们表现得更好。

https://medium.com/madhash/composite-pattern-in-a-nutshell-ad1bf78479cc?source=post_internal_links---------2------------------