java.lang.String的replace()和replaceAll()方法有什么区别? 除了以后使用正则表达式?对于简单的替换,比如替换。用/, 有什么区别吗?
当前回答
replace()方法不使用正则表达式模式而replaceAll()方法使用正则表达式模式。因此replace()比replaceAll()执行得更快。
其他回答
正如在wickeD的回答中提到的,使用replaceAll替换字符串在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不同,在perl中替换不需要额外的转义级别:
#!/bin/perl
$esc = "\\";
$s = "X";
$s =~ s/X/${esc}X/;
print "$s " . length($s) . "\n";
的打印 \ X 2
这可能非常麻烦,因为当尝试使用java.sql.DatabaseMetaData.getSearchStringEscape()与replaceAll()一起返回的值时。
replace()方法被重载以同时接受基本字符和CharSequence作为参数。
现在,就性能而言,replace()方法比replaceAll()方法快一些,因为后者首先编译正则表达式模式,然后在最终替换之前进行匹配,而前者只是匹配提供的参数并进行替换。
因为我们知道正则表达式模式匹配有点复杂,因此更慢,所以建议尽可能使用replace()而不是replaceAll()。
例如,对于你提到的简单替换,最好使用:
replace('.', '\\');
而不是:
replaceAll("\\.", "\\\\");
注意:上面的转换方法参数是系统相关的。
在Java 9中,对替换方法进行了一些优化。
在Java 8中,它使用正则表达式。
public String replace(CharSequence target, CharSequence replacement) {
return Pattern.compile(target.toString(), Pattern.LITERAL).matcher(
this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
}
Java 9及以上版本。
和Stringlatin实现。
它们表现得更好。
https://medium.com/madhash/composite-pattern-in-a-nutshell-ad1bf78479cc?source=post_internal_links---------2------------------
为了添加到已经选择的“最佳答案”(以及其他像Suragch的一样好的答案),String.replace()被限制为替换顺序字符(因此接受CharSequence)。但是,String.replaceAll()不受仅替换顺序字符的约束。只要正则表达式以这种方式构造,就可以替换非顺序字符。
此外(最重要也是最明显的),replace()只能替换文字值;而replaceAll可以替换“like”序列(不一定相同)。
replace适用于char数据类型,而replaceAll适用于String数据类型,两者都将第一个实参替换为第二个实参。
推荐文章
- 在流中使用Java 8 foreach循环移动到下一项
- 访问限制:'Application'类型不是API(必需库rt.jar的限制)
- 用Java计算两个日期之间的天数
- 如何配置slf4j-simple
- Printf与std::字符串?
- 在Jar文件中运行类
- 带参数的可运行?
- 不区分大小写的“in”
- 我如何得到一个字符串的前n个字符而不检查大小或出界?
- 我可以在Java中设置enum起始值吗?
- Java中的回调函数
- 如何在PHP中截断字符串最接近于一定数量的字符?
- c#和Java中的泛型有什么不同?和模板在c++ ?
- 在Java中,流相对于循环的优势是什么?
- Jersey在未找到InjectionManagerFactory时停止工作