Javaで文字列を置換するには replace()・replaceAll()・replaceFirst() があります。使い分けの最重要ポイントは「正規表現かどうか」です。replaceAll() は第1引数が正規表現なので、ドット . を渡すと全文字が置換されるなどの落とし穴があります。この記事で正しい使い分けを解説します。
この記事の結論:
replace() はリテラル(そのままの文字列)置換、replaceAll() / replaceFirst() は正規表現置換です。記号(. * など)をそのまま置換したいなら replace()、パターンで置換したいなら replaceAll() を使います。replace():そのままの文字列で置換(リテラル)
replace() は指定した文字列をそのまま(リテラル)置換します。正規表現は使われないので、記号も特別な意味を持たず安全です。一致箇所はすべて置換されます。
replace(リテラル置換)
String original = "Java is fun!";
System.out.println(original.replace("fun", "awesome")); // Java is awesome!
// ドットもそのまま置換される(正規表現でない)
System.out.println("a.b.c".replace(".", "_")); // a_b_c
replaceAll():正規表現で置換(.の罠に注意)
replaceAll() は第1引数が正規表現です。パターンにマッチする部分をすべて置換します。ここで最大の落とし穴が、正規表現の特殊文字です。
NG: . は「任意の1文字」にマッチする
// ドットを置換したつもりが、全文字が置換される!
System.out.println("a.b.c".replaceAll(".", "_")); // _____(. = 任意の1文字)
// 正しく「リテラルのドット」を置換するには
System.out.println("a.b.c".replaceAll("\\.", "_")); // a_b_c(\. でエスケープ)
replaceAll(".", "_") は全文字を置換します。正規表現で . は「任意の1文字」を意味するためです。リテラルの記号(. * + ? [ ] ( ) | \ など)を置換したいなら、\\ でエスケープするか、正規表現が不要なら最初から replace() を使ってください。OK: パターンで置換する本来の用途
// 小文字アルファベットをすべて * に
System.out.println("12abc34def56".replaceAll("[a-z]", "*")); // 12***34***56
// 連続する空白を1つにまとめる
System.out.println("a b c".replaceAll("\\s+", " ")); // a b c
replaceFirst():最初の1か所だけ置換
replaceFirst() も正規表現ですが、最初にマッチした1か所だけを置換します。
replaceFirst
String s = "12abc34abc56";
System.out.println(s.replaceFirst("abc", "***")); // 12***34abc56
注意:replaceAllの置換文字列の $ と \
replaceAll() / replaceFirst() では、置換後の文字列でも $ と \ が特別な意味を持ちます($1 は後方参照)。金額の「$100」などをそのまま入れたいときは注意が必要です。
置換文字列の $ をリテラルにする
// $ をそのまま入れたい場合は quoteReplacement を使う
import java.util.regex.Matcher;
String price = Matcher.quoteReplacement("$100");
System.out.println("価格はXXX".replaceAll("XXX", price)); // 価格は$100
// 後方参照を使う例(() の一致部分を $1 で参照)
System.out.println("2026-06".replaceAll("(\\d{4})-(\\d{2})", "$2/$1")); // 06/2026
replace()・replaceAll() はいずれも新しい文字列を返すだけで、元の文字列は変更しません(Stringは不変)。結果は必ず変数で受け取ってください。よくある質問(FAQ)
QreplaceとreplaceAllの違いは?
A
replace() はリテラル置換(そのままの文字列)、replaceAll() は正規表現置換です。どちらも一致箇所をすべて置換しますが、記号の扱いが大きく異なります。QreplaceAll(“.”, “x”)で全部置換されました。
A正規表現で
. は「任意の1文字」を意味するためです。リテラルのドットを置換したいなら replaceAll("\\.", "x") とエスケープするか、replace(".", "x") を使ってください。Q最初の1つだけ置換したいです。
A
replaceFirst() を使います。正規表現にマッチする箇所のうち、最初の1つだけを置換します。Q置換後の文字列に $ を入れたらエラーになります。
A
replaceAll() の置換文字列では $ と \ が特別な意味を持つためです。Matcher.quoteReplacement() で囲むと、リテラルとして扱えます。まとめ
Javaの文字列置換のポイントを整理します。
replace()はリテラル、replaceAll()/replaceFirst()は正規表現replaceAll(".", "x")は全文字置換(.は任意の1文字)- 記号をそのまま置換するなら
replace()か\\でエスケープ - 最初の1つだけは
replaceFirst() - 置換文字列の
$・\はMatcher.quoteReplacement()でリテラル化
関連として、文字列から改行を除去・置換する方法・substringで文字列を切り出す方法・先頭と末尾のスペースを削除する方法もあわせて読むと、Javaの文字列操作に強くなれます。
