Java.lang.Stringのreplace()
メソッドとreplaceAll()
メソッドの違いは何ですか?後でregexを使用する以外は?のような単純な置換では、.
を/
に置き換えます。違いはありますか?
Java.lang.String
では、replace
メソッドはcharのペアかCharSequence
のペア(Stringはサブクラスです。したがって、Stringのペアを取ります)を取ります。 replace
メソッドは、出現するすべてのcharまたはCharSequence
を置き換えます。一方、String
およびreplaceFirst
へのreplaceAll
引数はどちらも正規表現です(regex)。誤った機能を使用すると、微妙なバグが発生する可能性があります。
Q:Java.lang.String
メソッドreplace()
とreplaceAll()
の違いは何ですか。
A:正規表現だけです。両方ともすべてを置き換えます:)
http://docs.Oracle.com/javase/6/docs/api/Java/lang/String.html
シモンズ:
replaceFirst()
もあります(これは正規表現を取ります)
replace()
メソッドは、プリミティブchar
とCharSequence
の両方を引数として受け取るためにオーバーロードされています。
パフォーマンスに関しては、replace()
メソッドはreplaceAll()
より少し速いです。後者は最初に正規表現パターンをコンパイルしてから最後に置換する前にマッチするからです。
正規表現のパターンマッチングはもう少し複雑で遅くなることがわかっているので、可能であればreplace()
よりreplaceAll()
を優先することをお勧めします。
例えば、あなたが言及したような単純な置換のためには、それを使うことがより良いです:
replace('.', '\\');
の代わりに:
replaceAll("\\.", "\\\\");
注意:上記の変換方法の引数はシステムに依存します。
replace()
とreplaceAll()
は両方ともString内のすべての出現箇所を置き換えます。
その違いを理解するのに役立つ例が常にあります。
replace()
単にいくつかのchar
を別のchar
に、またはいくつかのString
を別の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
文字列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
ドキュメンテーション
replace(char oldChar, char newChar)
replace(CharSequence target, CharSequence replacement)
replaceAll(String regex, String replacement)
replaceFirst(String regex, String replacement)
正規表現
String replace(char oldChar, char newChar)
この文字列内に出現するoldCharをすべてnewCharに置き換えた結果の新しい文字列を返します。
String replaceAll(String regex, String replacement
与えられた正規表現にマッチするこの文字列の各部分文字列を与えられた文字列に置き換えます。
その実装で両方が同じコードを使用するため、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?"
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()で使用しようとしたときのように、これは非常に厄介な作業になります。
古いスレッド私は知っていますが、私は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 );