String replace()和replaceAll()之间的区别
java.lang.String的replace()
和replaceAll()
方法有什么区别,除了以后使用regex? 对于简单的replace,replace.
与/
,有什么区别?
在java.lang.String
, replace
方法需要一对char或一对CharSequence
(其中的String是一个子类,所以它会愉快地采取一对string)。 replace
方法将replacechar或CharSequence
所有匹配项。 另一方面, replaceFirst
和replaceAll
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()
方法被重载,接受原始char
和CharSequence
作为参数。
现在就性能而言, replace()
方法比replaceAll()
快一点,因为稍后第一次编译正则expression式模式,然后在最终replace之前匹配,而前者只是简单地匹配提供的参数并replace。
由于我们知道正则expression式匹配比较复杂,所以比较慢,所以build议尽可能使用replace()
over replaceAll()
。
例如,对于像您提到的简单replace,最好使用:
replace('.', '\\');
代替:
replaceAll("\\.", "\\\\");
注意:上面的转换方法参数是依赖于系统的。
- replace()和replaceAll()接受两个参数,并用第二个子string(第二个参数)replacestring中第一个子string(第一个参数)的所有匹配项。
- replace()接受一对char或charsequence,replaceAll()接受一对正则expression式。
-
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()
如果你只是想用另一个String
replace一些char
或一些String
(实际上是char
CharSequence
)。
例1
用o
replace所有出现的字符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
用sheep
replace所有出现的串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所有第一个参数。