java.lang.String的replace()和replaceAll()方法有什么区别? 除了以后使用正则表达式?对于简单的替换,比如替换。用/, 有什么区别吗?
. lang。String, replace方法要么取一对char's,要么取一对CharSequence's (String是其中的一个子类,所以它很乐意取一对String's)。replace方法将替换所有出现的char或CharSequence。另一方面,replaceFirst和replaceAll的第一个String参数是正则表达式(regex)。使用错误的函数可能会导致微妙的错误。
问:java.lang.String方法replace()和replaceAll()有什么区别,除了后者使用regex。
A:只是正则表达式。它们都替换了所有:)
http://docs.oracle.com/javase/8/docs/api/java/lang/String.html
PS:
还有一个replaceFirst()(接受一个正则表达式)
replace()方法被重载以同时接受基本字符和CharSequence作为参数。
现在,就性能而言,replace()方法比replaceAll()方法快一些,因为后者首先编译正则表达式模式,然后在最终替换之前进行匹配,而前者只是匹配提供的参数并进行替换。
因为我们知道正则表达式模式匹配有点复杂,因此更慢,所以建议尽可能使用replace()而不是replaceAll()。
例如,对于你提到的简单替换,最好使用:
replace('.', '\\');
而不是:
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 );
String replace(char oldChar, char newChar)
返回一个新字符串,结果是将该字符串中所有出现的oldChar替换为newChar。
String replaceAll(String regex, String replacement
用给定的替换替换此字符串中与给定正则表达式匹配的每个子字符串。
replace()和replaceAll()都接受两个参数,并用第二个子字符串(第二个参数)替换字符串中出现的所有第一个子字符串(第一个参数)。 replace()接受一对char或charsequence, replaceAll()接受一对regex。 replace()并不比replaceAll()工作得快,因为两者在实现中使用相同的代码 Pattern.compile(正则表达式).matcher(这).replaceAll(替代);
现在的问题是什么时候使用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替换字符串在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()和replaceAll()都会替换String中出现的所有内容。
例子
我总是发现例子有助于理解差异。
替换()
如果你只是想用另一个字符替换一些字符,或者用另一个字符串替换一些字符串(实际上是CharSequence),请使用replace()。
示例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
把所有出现的鱼串换成羊。
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) 替换(CharSequence目标,CharSequence替换) replaceAll(字符串正则表达式,字符串替换) replaceFirst(字符串正则表达式,字符串替换)
正则表达式
教程 模式列表
为了添加到已经选择的“最佳答案”(以及其他像Suragch的一样好的答案),String.replace()被限制为替换顺序字符(因此接受CharSequence)。但是,String.replaceAll()不受仅替换顺序字符的约束。只要正则表达式以这种方式构造,就可以替换非顺序字符。
此外(最重要也是最明显的),replace()只能替换文字值;而replaceAll可以替换“like”序列(不一定相同)。
在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------------------
用一个例子来说明下面的代码是如何工作的:
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
解释
s.replace将“\\s”字符序列替换为c。因此,在第一行输出。 s.s replaceall认为\\s是一个正则表达式(相当于空格),并将空格替换为c。字符串s中的\\s会被第一次遇到的\转义并变成\s。
Intellij Idea足够智能,可以通知您的使用情况。如果你仔细看看下图,你会发现Intellij对replace和replaceAll用法的解释差异。
推荐文章
- 如何分割逗号分隔的字符串?
- Java字符串—查看字符串是否只包含数字而不包含字母
- Mockito.any()传递带有泛型的接口
- 在IntelliJ 10.5中运行测试时,出现“NoSuchMethodError: org.hamcrest. matcher . descripbemismatch”
- 使用String.split()和多个分隔符
- 用javascript检查输入字符串中是否包含数字
- Java数组有最大大小吗?
- 在Android中将字符串转换为Uri
- 从JSON生成Java类?
- 为什么java.util.Set没有get(int index)?
- Swing和AWT的区别是什么?
- 为什么Java流是一次性的?
- 四舍五入BigDecimal *总是*有两位小数点后
- 设计模式:工厂vs工厂方法vs抽象工厂
- Java:检查enum是否包含给定的字符串?