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


当前回答

老线程我知道,但我对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 );

其他回答

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

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

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

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

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

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

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?"

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

问:java.lang.String方法replace()和replaceAll()有什么区别,除了后者使用regex。

A:只是正则表达式。它们都替换了所有:)

http://docs.oracle.com/javase/8/docs/api/java/lang/String.html

PS:

还有一个replaceFirst()(接受一个正则表达式)