279

後で正規表現を使用する以外のjava.lang.Stringreplace()とメソッドの違いは何ですか?replaceAll()のような単純な置換の場合、に置き換えます./ 、違いはありますか?

4

13 に答える 13

221

ではjava.lang.Stringreplaceメソッドはcharのペアまたは'のペアのいずれかを取りますCharSequence(そのうちのStringはサブクラスであるため、Stringのペアを取ります)。このreplaceメソッドは、charまたは。のすべての出現箇所を置き換えますCharSequence。一方、との最初の 引数Stringは正規表現(regex)です。間違った機能を使用すると、微妙なバグが発生する可能性があります。replaceFirstreplaceAll

于 2012-05-31T05:28:07.683 に答える
125

Q:とのjava.lang.Stringメソッドの違いは何ですか。後者は正規表現を使用します。replace()replaceAll()

A:正規表現のみです。どちらもすべてを置き換えます:)

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

PS:

replaceFirst()(正規表現を取る)もあります

于 2012-05-31T05:29:13.230 に答える
39

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

パフォーマンスに関する限り、後者は最初に正規表現パターンをコンパイルしてから最終的に置換する前に一致するため、replace()メソッドは少し高速ですreplaceAll()が、前者は提供された引数に単に一致して置換します。

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

たとえば、あなたが言及したような単純な置換の場合、次を使用することをお勧めします。

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

それ以外の:

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

注: 上記の変換メソッドの引数はシステムに依存します。

于 2012-05-31T05:33:22.237 に答える
6
  1. replace() と replaceAll() はどちらも 2 つの引数を受け入れ、文字列内の最初の部分文字列 (最初の引数) のすべての出現箇所を 2 番目の部分文字列 (2 番目の引数) に置き換えます。
  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

例を使用して、以下のコードで両方がどのように機能するかをさらに詳しく説明します。

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.replaceAll は、\\s を (スペースと同等の) 正規表現と見なし、スペースを c に置き換えます。文字列 s の \\s は、最初に遭遇した \ でエスケープされ、\s になります。

Intellij Idea は、使用状況も通知するほどスマートです。下の画像をよく見ると、置換と置換すべての使用法に対する Intellij の考え方による解釈の違いがわかります。

ここに画像の説明を入力

于 2021-05-24T08:37:10.110 に答える
0

replace()メソッドは正規表現パターンを使用しませんが、replaceAll()メソッドは正規表現パターンを使用します。そのreplace()ため、 よりも高速に実行されますreplaceAll()

于 2015-06-10T07:07:37.837 に答える
-5

replace は char データ型で機能しますが、replaceAll は String データ型で機能し、どちらも最初の引数のすべての出現箇所を 2 番目の引数に置き換えます。

于 2012-05-31T05:35:51.733 に答える