Java 字符串replace()和replaceAll()之间的差异
java.lang.String的Java 字符串replace()和replaceAll()之间的差异,java,string,replace,Java,String,Replace,java.lang.String的replace()和replaceAll()方法之间有什么区别, 除了以后使用正则表达式之外?对于简单的替换,例如,将替换为/, 有什么不同吗?在中,replace方法要么接受一对char,要么接受一对CharSequence(其中String是一个子类,所以它很乐意接受一对String)。replace方法将替换所有出现的字符或CharSequence。另一方面,replaceFirst和replaceAll的第一个String参数是正则表达式(regex)。
replace()
和replaceAll()
方法之间有什么区别,
除了以后使用正则表达式之外?对于简单的替换,例如,将
替换为/
,
有什么不同吗?在中,
replace
方法要么接受一对char,要么接受一对CharSequence
(其中String是一个子类,所以它很乐意接受一对String)。replace
方法将替换所有出现的字符或CharSequence
。另一方面,replaceFirst
和replaceAll
的第一个String
参数是正则表达式(regex)。使用错误的函数可能会导致细微的错误。Q:java.lang.String方法replace()
和replaceAll()
之间有什么区别,除了后者使用regex之外
A:只有正则表达式。它们都替换所有:)
附言:
还有一个replaceFirst()
(它接受一个正则表达式)重载replace()
方法以接受原语char
和CharSequence
作为参数
现在就性能而言,replace()
方法比replaceAll()
方法快一点,因为后者首先编译regex模式,然后在最终替换之前进行匹配,而前者只匹配提供的参数并进行替换
由于我们知道正则表达式模式匹配更复杂,因此速度较慢,因此建议尽可能选择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 );
返回一个新字符串,该字符串由newChar替换该字符串中所有出现的oldChar生成
String replaceAll(String regex, String 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?"
正如在wickeD的回答中提到的,对于replaceAll,replaceAll和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不同,perl的替换不需要额外的转义级别:
#!/bin/perl
$esc = "\\";
$s = "X";
$s =~ s/X/${esc}X/;
print "$s " . length($s) . "\n";
哪张照片
\x2
这可能是一个相当麻烦的问题,当尝试将java.sql.DatabaseMetaData.getSearchStringEscape()返回的值与replaceAll()一起使用时。同时使用replace()
和replaceAll()
例子
我总是发现例子有助于理解差异
如果您只想用另一个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()
示例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
另见
文件
正则表达式
要添加到已选择的“最佳答案”(以及其他与Suragch的答案一样好的答案),String.replace()
通过替换连续字符(因此采用CharSequence
)进行约束。但是,String.replaceAll()
不受仅替换顺序字符的限制。只要正则表达式是以这种方式构造的,就可以替换非连续字符
同样(最重要也是最明显的),replace()
只能替换文字值;而replaceAll
可以替换“like”序列(不一定完全相同)。从Java 9开始,replace方法中有一些优化
在Java8中,它使用r
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
public String replace(CharSequence target, CharSequence replacement) {
return Pattern.compile(target.toString(), Pattern.LITERAL).matcher(
this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
}
public static void main(String[] args)
{
String s = "My\\s aaab\\s is\\s aaab\\s name";
String s1 = s.replace("\\s", "c");
System.out.println(s1);
String s2 = s.replaceAll("\\s", "c");
System.out.println(s2);
}
Myc aaabc isc aaabc name
My\scaaab\scis\scaaab\scname