こんにちは。「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」の前後に空白をいれています。
以上、参考になれば幸いです。