web-dev-qa-db-ja.com

文字列replace()とreplaceAll()の違い

Java.lang.Stringのreplace()メソッドとreplaceAll()メソッドの違いは何ですか?後でregexを使用する以外は?のような単純な置換では、./に置き換えます。違いはありますか?

188
Jijoy

Java.lang.String では、replaceメソッドはcharのペアかCharSequenceのペア(Stringはサブクラスです。したがって、Stringのペアを取ります)を取ります。 replaceメソッドは、出現するすべてのcharまたはCharSequenceを置き換えます。一方、StringおよびreplaceFirstへのreplaceAll引数はどちらも正規表現です(regex)。誤った機能を使用すると、微妙なバグが発生する可能性があります。

152
emilan

Q:Java.lang.Stringメソッドreplace()replaceAll()の違いは何ですか。

A:正規表現だけです。両方ともすべてを置き換えます:)

http://docs.Oracle.com/javase/6/docs/api/Java/lang/String.html

シモンズ:

replaceFirst()もあります(これは正規表現を取ります)

78
paulsm4

replace()メソッドは、プリミティブcharCharSequenceの両方を引数として受け取るためにオーバーロードされています。

パフォーマンスに関しては、replace()メソッドはreplaceAll()より少し速いです。後者は最初に正規表現パターンをコンパイルしてから最後に置換する前にマッチするからです。

正規表現のパターンマッチングはもう少し複雑で遅くなることがわかっているので、可能であればreplace()よりreplaceAll()を優先することをお勧めします。

例えば、あなたが言及したような単純な置換のためには、それを使うことがより良いです:

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

の代わりに:

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

注意:上記の変換方法の引数はシステムに依存します。

30

replace()replaceAll()は両方ともString内のすべての出現箇所を置き換えます。

その違いを理解するのに役立つ例が常にあります。

replace()

単にいくつかのcharを別のcharに、またはいくつかのStringを別のString(実際にはCharSequence)に置き換えたい場合は、replace()を使用してください。

例1

すべての文字xoに置き換えます。

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

また見なさい

ドキュメンテーション

正規表現

25
Suragch
String replace(char oldChar, char newChar)

この文字列内に出現するoldCharをすべてnewCharに置き換えた結果の新しい文字列を返します。

String replaceAll(String regex, String replacement

与えられた正規表現にマッチするこの文字列の各部分文字列を与えられた文字列に置き換えます。

3
S. Rahul
  1. Replace()とreplaceAll()はどちらも2つの引数を受け入れ、文字列内の最初のサブストリング(最初の引数)のすべての出現箇所を2番目のサブストリング(2番目の引数)で置き換えます。
  2. replace()は1組のcharまたはcharsequenceを受け入れ、replaceAll()は1組の正規表現を受け入れます。
  3. その実装で両方が同じコードを使用するため、replace()がreplaceAll()よりも速く動作することは正しくありません。

    Pattern.compile(正規表現).matcher(this).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?"
3
Aarya

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とは異なります。

#!/bin/Perl
$esc = "\\";
$s = "X";

$s =~ s/X/${esc}X/;
print "$s " . length($s) . "\n";

\ X 2を印刷する

Java.sql.DatabaseMetaData.getSearchStringEscape()によって返された値をreplaceAll()で使用しようとしたときのように、これは非常に厄介な作業になります。

1
Keith Crews

古いスレッド私は知っていますが、私はJavaの一種であり、そのうちの1つを奇妙なことに気付きました。 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 );
0
Codebeat