Answers:
在中java.lang.String
,该replace
方法可以采用一对char或一对CharSequence
(其中String是子类,因此很高兴采用一对String)。该replace
方法将替换所有出现的char或CharSequence
。在另一方面,这两个String
参数replaceFirst
和replaceAll
正则表达式(正则表达式)。使用错误的功能可能导致细微的错误。
String#replace(target, replacement)
同样的事情,除了它引用了字符串:Pattern.compile(target.toString(), Pattern.LITERAL).matcher(this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
是否有某些原因String#replace
会导致比更快String#replaceAll
?由于String#replace
只执行其他操作,因此看起来并不理想。
replaceAll
。答案更多关于replace
问:和的java.lang.String
方法有什么区别,除了以后使用正则表达式。replace()
replaceAll()
答:只是正则表达式。他们都替换所有 :)
http://docs.oracle.com/javase/6/docs/api/java/lang/String.html
PS:
还有一个replaceFirst()
(需要正则表达式)
CharSequence
而是。两者replace()
和replaceAll()
“一起工作CharSequence
”。这是replaceAll()
考虑给定CharSequence
为正则表达式,所以它看起来为正则表达式匹配,同时replace()
考虑给予CharSequence
以纯文本的搜索,所以它看起来对出现的吧。
两者replace()
和replaceAll()
替换字符串中的所有匹配项。
我总是会找到一些有助于理解差异的示例。
replace()
使用replace()
,如果你只是想更换一些char
与另一个char
或一些String
与另一个String
(实际上CharSequence
)。
例子1
替换字符出现的所有x
同o
。
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
替换字符串中出现的所有fish
同sheep
。
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()
使用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)
常用表达
该replace()
方法被重载以接受原始char
和a CharSequence
作为参数。
现在,就性能而言,该replace()
方法要快一些,replaceAll()
因为后者首先编译正则表达式模式,然后在最终替换之前进行匹配,而前者只是匹配提供的参数并进行替换。
因为我们知道正则表达式模式匹配是一个稍微复杂一些,因此速度较慢,则宁愿replace()
过replaceAll()
建议只要有可能。
例如,对于您提到的简单替换,最好使用:
replace('.', '\\');
代替:
replaceAll("\\.", "\\\\");
注意:以上转换方法参数与系统有关。
Pattern.compile(...)
在其实现中出现了内容/部分,replace
关于如何定义/发送第一个参数似乎并不那么复杂。它不需要"\"
。此外replace
可从Java 1.5
和replaceAll
自1.4
String replace(char oldChar, char newChar)
返回一个新字符串,该字符串是用newChar替换此字符串中所有出现的oldChar的结果。
String replaceAll(String regex, String replacement
用给定的替换项替换该字符串中与给定的正则表达式匹配的每个子字符串。
并不是replace()比replaceAll()更快地工作,因为两者在实现中都使用相同的代码
Pattern.compile(regex).matcher(this).replaceAll(replacement);
现在的问题是何时使用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
不打电话Pattern.compile(regex).matcher(this).replaceAll(replacement);
。它呼吁Pattern.compile(target.toString(), Pattern.LITERAL).matcher(this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
就像在wickeD的答案中提到的那样,使用replaceAll替换字符串在replace和replaceAll之间的处理方式有所不同。我期望a [3]和a [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()
但是得到了不可预测的结果。
像这样的东西弄乱了字符串:
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 );
replace()
方法不使用正则表达式模式,而replaceAll()
方法使用正则表达式模式。因此replace()
执行速度比快replaceAll()
。
replace对char数据类型有效,但是replaceAll对String数据类型有效,并且都将第二个参数替换所有出现的第一个参数。
str.replaceAll(regex, repl)
均与相同Pattern.compile(regex).matcher(str).replaceAll(repl)
。因此,根据使用量的不同,会有很大的开销。