String replace()和replaceAll()之间的区别

java.lang.String的replace()replaceAll()方法有什么区别,除了以后使用regex? 对于简单的replace,replace./ ,有什么区别?

java.lang.Stringreplace方法需要一对char或一对CharSequence (其中的String是一个子类,所以它会愉快地采取一对string)。 replace方法将replacechar或CharSequence所有匹配项。 另一方面, replaceFirstreplaceAll String参数都是正则expression式(正则expression式)。 使用错误的function会导致微妙的错误。

问: java.lang.String方法replace()replaceAll()之间的区别是什么,除了后者使用正则expression式。

答:只是正则expression式。 他们都取代所有 🙂

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

PS:

还有一个replaceFirst() (需要一个正则expression式)

replace()方法被重载,接受原始charCharSequence作为参数。

现在就性能而言, replace()方法比replaceAll()快一点,因为稍后第一次编译正则expression式模式,然后在最终replace之前匹配,而前者只是简单地匹配提供的参数并replace。

由于我们知道正则expression式匹配比较复杂,所以比较慢,所以build议尽可能使用replace() over replaceAll()

例如,对于像您提到的简单replace,最好使用:

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

代替:

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

注意:上面的转换方法参数是依赖于系统的。

  1. replace()和replaceAll()接受两个参数,并用第二个子string(第二个参数)replacestring中第一个子string(第一个参数)的所有匹配项。
  2. replace()接受一对char或charsequence,replaceAll()接受一对正则expression式。
  3. replace()的工作速度比replaceAll()快,因为两者在其实现中使用相同的代码

    Pattern.compile(正则expression式).matcher(本).replaceAll(replace);

现在的问题是什么时候使用replace和何时使用replaceAll()。 当你想用另一个子stringreplace一个子string,不pipe它在string中的出现位置是什么,使用replace()。 但是,如果你有一些特定的偏好或条件,像只replacestring开头或结尾的那些子string,请使用replaceAll()。 这里有一些例子来certificate我的观点:

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

返回由newCharreplace此string中出现的所有oldChar所产生的新string。

 String replaceAll(String regex, String replacement 

用给定的replacereplace此string中与给定正则expression式匹配的每个子string。

正如在wickeD的回答中所暗示的那样,用replaceAllreplacestring在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不同,它不需要额外的转义级别:

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

打印\ X 2

这可能是一个相当麻烦,因为当试图使用java.sql.DatabaseMetaData.getSearchStringEscape()返回值与replaceAll()。

老线程我知道,但我对Java有点新,发现它是奇怪的事情之一。 我已经使用String.replaceAll()但得到不可预知的结果。

像这样的东西弄乱了string:

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

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

 //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 ); 

replace()方法不使用正则expression式模式,而replaceAll()方法使用正则expression式模式。 所以replace()执行速度比replaceAll()快。

replace()replaceAll()replace了string中的所有匹配项。

例子

我总是find有助于理解差异的例子。

replace()

使用replace()如果你只是想用另一个Stringreplace一些char或一些String (实际上是char CharSequence )。

例1

oreplace所有出现的字符x

 String myString = "__x___x___x_x____xx_"; char oldChar = 'x'; char newChar = 'o'; String newString = myString.replace(oldChar, newChar); // __o___o___o_o____oo_ 

例2

sheepreplace所有出现的串fish

 String myString = "one fish, two fish, three fish"; String target = "fish"; String replacement = "sheep"; String newString = myString.replace(target, replacement); // one sheep, two sheep, three sheep 

replaceAll()

如果你想给我们一个正则expression式模式,使用replaceAll()

例3

x代替任何数字。

 String myString = "__1_6____3__6_345____0"; String regex = "\\d"; String replacement = "x"; String newString = myString.replaceAll(regex, replacement); // __x_x____x__x_xxx____x 

例4

删除所有的空格。

 String myString = " Horse Cow\n\n \r Camel \t\t Sheep \n Goat "; String regex = "\\s"; String replacement = ""; String newString = myString.replaceAll(regex, replacement); // HorseCowCamelSheepGoat 

也可以看看

文档

  • replace(char oldChar, char newChar)
  • replace(CharSequence target, CharSequence replacement)
  • replaceAll(String regex, String replacement)
  • replaceFirst(String regex, String replacement)

正则expression式

  • 教程
  • 模式列表

replacechar数据types的工作,但replaceAll对String数据types起作用,并用第二个参数replace所有第一个参数。