StringのreplaceとreplaceAll

こんにちは。「Javaを復習する初心者」です。

今回はStringクラスのreplace()メソッドとreplaceAll()メソッドについて、使い方を確認しました。

2つのメソッドの相違点

replace()メソッドとreplaceAll()メソッドは、文字列の置換をするメソッドです。これらのメソッドの違いは、正規表現をが使えるかどうかです。replace()メソッドでは正規表現は使えません。replaceAllは正規表現を使うことができます。

replace()メソッドは以下の2つのメソッドが用意されます

  • replace(char oldChar, char newChar)
  • replace(CharSequence target, CharSequence replacement)

使い方は[String型のインスタンス].replece('a’, 'b’)のような使い方です。勘違いしやすい点として、元のインスタンスの文字列自体は変化しません。常に新しいString型のインスタンスが返却されます。

replaceAll()メソッドは以下の1つのメソッドが用意されています。

  • public String replaceAll(String regex, String replacement)

第1引数には正規表現を指定します。

使用例

replace

具体的にメソッドを使ってみましょう。前回の記事で使った著作権フリーの英文から適当に文字列を選びました。今回は「Without farther enumerating or explaining the prizes」という部分を使います。この文字がString型変数strに格納されているとします。以下は文字「a」を文字「A」に置き換えるという動作をします。引数にchar型の値を指定するため、文字をシングルクォーテーションで囲んでます。

「a」->「A」
String str = "Without farther enumerating or explaining the prizes";
System.out.println(str.replace('a', 'A'));
結果
Without fArther enumerAting or explAining the prizes

上記のように出力されました。元の文中には何回か「a」という文字が登場してますが、すべて「A」に置き換わってます。

以下は「in」を「IN」に変えるという動作をします。引数はCharSequenceインターフェースですが、Stringクラスはこのインターフェースを実装しているので、引数に指定できます。

「in」->「IN」
        System.out.println(str.replace("in", "IN"));
結果
Without farther enumeratINg or explaININg the prizes

上記のように出力されました。

replaceAll

今度はreplaceAll()メソッドを使ってみました。String型変数に"This is a pen. That is a pen."が格納されているとします。この文章で動詞「is」を「is not」に変えるということを考えます。次のようにreplece()メソッドを使うと期待通りの結果にはなりません。

repleceAllの失敗例
String str = "This is a pen. That is a pen.";
System.out.println(str.replace("is", "is not"));
失敗例の結果
This not is not a pen. That is not a pen.

「This」の「is」が変換されてしました。単語を考慮しなかったからです。第1引数を" is “にしても良いのですが、今回はreplaceAllで正規表現を使ってみます。あまり工夫する箇所はないのですが、以下のように空白を表す正規表現を使ってみました。

repleceAllの成功例
System.out.println(str.replaceAll("\\sis\\s", " is not "));
成功例の結果
This is not a pen. That is not a pen.

期待通りの結果になりました。注意する箇所はisの前後の空白も置き換わる点です。そのため、第2引数では「is not」の前後に空白をいれています。

以上、参考になれば幸いです。

同じカテゴリーの前後の記事