Java 字符串replace()和replaceAll()之间的差异

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)。

java.lang.String的
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()

  • replace()和replaceAll()都接受两个参数,并用第二个子字符串(第二个参数)替换字符串中出现的第一个子字符串(第一个参数)
  • replace()接受一对char或charsequence,replaceAll()接受一对regex
  • 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?"
    

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