279

replace()java.lang.String和方法之间有什么区别replaceAll(),除了后来使用正则表达式?对于像替换这样的简单替换./ 有什么区别吗?

4

13 回答 13

221

java.lang.String中,该replace方法要么采用一对 char ,要么采用一对CharSequence'(其中 String 是一个子类,因此它很乐意采用一对 String)。该replace方法将替换所有出现的 char 或CharSequence. 另一方面, and的第一个String参数是正则表达式(regex)。使用错误的函数可能会导致细微的错误。replaceFirstreplaceAll

于 2012-05-31T05:28:07.683 回答
125

问:除了后者使用正则表达式之外,java.lang.String方法replace()和之间有什么区别。replaceAll()

答:只是正则表达式。他们都替换了所有:)

http://docs.oracle.com/javase/8/docs/api/java/lang/String.html

PS:

还有一个replaceFirst()(需要一个正则表达式)

于 2012-05-31T05:29:13.230 回答
68

两者都replace()替换replaceAll()字符串中的所有匹配项。

例子

我总是找到有助于理解差异的示例。

replace()

如果replace()您只想用另一个替换一些charcharString另一个替换一些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

也可以看看

文档

常用表达

于 2017-11-14T02:28:19.820 回答
39

replace()方法被重载以接受原语char和 aCharSequence作为参数。

现在就性能而言,该replace()方法比后者要快一点,replaceAll()因为后者首先编译正则表达式模式,然后在最终替换之前匹配,而前者只是匹配提供的参数并替换。

由于我们知道正则表达式模式匹配有点复杂,因此速度较慢,因此建议尽可能replace()优先使用。replaceAll()

例如,对于您提到的简单替换,最好使用:

replace('.', '\\');

代替:

replaceAll("\\.", "\\\\");

注意:上述转换方法参数是系统相关的。

于 2012-05-31T05:33:22.237 回答
6
  1. replace() 和 replaceAll() 都接受两个参数,并用第二个子字符串(第二个参数)替换字符串中第一个子字符串(第一个参数)的所有出现。
  2. replace() 接受一对 char 或 charsequence,replaceAll() 接受一对正则表达式。
  3. 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?"
于 2016-02-17T06:13:46.483 回答
3
String replace(char oldChar, char newChar)

返回一个新字符串,该字符串是用 newChar 替换此字符串中所有出现的 oldChar 所产生的。

String replaceAll(String regex, String replacement

用给定的替换替换此字符串中与给定正则表达式匹配的每个子字符串。

于 2015-04-30T07:34:37.930 回答
3

举一个例子来说明两者如何在以下代码中工作:

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 用 c 替换 "\\s" 字符序列。因此,第一行的输出。s.replaceAll 将 \\s 视为一个正则表达式(相当于空格)并用 c 替换空格。String s 中的 \\s 与遇到的第一个 \ 一起转义并变为 \s。

Intellij Idea 足够聪明,可以通知您使用情况。如果您仔细查看下图,您会看到 Intellij idea 对 replace 和 replaceAll 用法的解释不同。

在此处输入图像描述

于 2021-05-24T08:37:10.110 回答
1

正如 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() 一起使用时。

于 2017-02-24T21:58:55.693 回答
1

从 Java 9 开始,replace 方法进行了一些优化。

在 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--------------- ---

于 2020-09-03T13:49:31.197 回答
0

我知道旧线程,但我对 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 );
于 2014-03-22T13:18:50.187 回答
0

replace()方法不使用正则表达式模式,而replaceAll()方法使用正则表达式模式。所以replace()执行速度比replaceAll().

于 2015-06-10T07:07:37.837 回答
0

添加到已经选择的“最佳答案”(以及其他与 Suragch 一样好的答案),String.replace()受到替换顺序字符的限制(因此采用CharSequence)。但是,String.replaceAll()不仅限于替换连续字符。只要您的正则表达式是以这种方式构造的,您就可以替换非连续字符。

此外(最重要且非常明显)replace()只能替换文字值;而replaceAll可以替换“喜欢”的序列(不一定相同)。

于 2020-01-07T21:28:59.760 回答
-5

replace 适用于 char 数据类型,但 replaceAll 适用于 String 数据类型,并且都将第一个参数的所有出现替换为第二个参数。

于 2012-05-31T05:35:51.733 回答