Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

Java辞典

  1. トップページ
  2. Java辞典
  3. Matcher.replaceAll() / replaceFirst()

Matcher.replaceAll() / replaceFirst()

正規表現に一致した部分文字列を置換するメソッドです。『replaceAll()』はすべての一致箇所を、『replaceFirst()』は最初の一致箇所だけを置換します。

構文
// すべての一致箇所を指定した文字列で置換します。
String result = matcher.replaceAll(String replacement);

// 最初の一致箇所だけを置換します。
String result = matcher.replaceFirst(String replacement);

// 一致箇所を個別に処理しながら置換を構築します。
matcher.appendReplacement(StringBuffer sb, String replacement);

// 残りの文字列をStringBufferに追記します。
matcher.appendTail(StringBuffer sb);
メソッド一覧
メソッド概要
replaceAll(String replacement)パターンに一致するすべての部分文字列を replacement で置換した新しい文字列を返します。
replaceFirst(String replacement)パターンに最初に一致した部分文字列のみを置換します。
appendReplacement(StringBuffer sb, String replacement)前回マッチ終了位置から今回マッチ開始位置までの文字列と置換文字列を sb に追記します。
appendTail(StringBuffer sb)最後のマッチ終了位置以降の残りの文字列を sb に追記します。
replaceAll(Function<MatchResult,String> replacer)Java 9以降。マッチ結果を受け取る関数で置換文字列を動的に生成します。
サンプルコード
import java.util.regex.*;

// replaceAll() ですべての数字を「*」に置換します。
Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher("電話番号: 090-1234-5678");
System.out.println(m.replaceAll("*")); // 『電話番号: *-*-*』と出力されます。

// replaceFirst() で最初の一致箇所のみ置換します。
Matcher m2 = p.matcher("値は3で、個数は5です。");
System.out.println(m2.replaceFirst("N")); // 『値はNで、個数は5です。』と出力されます。

// appendReplacement() と appendTail() で動的な置換を行います。
Pattern wordPattern = Pattern.compile("\\b(Java|Python)\\b");
Matcher wordMatcher = wordPattern.matcher("JavaとPythonは人気の言語です。");
StringBuffer sb = new StringBuffer();
while (wordMatcher.find()) {
    wordMatcher.appendReplacement(sb, "[" + wordMatcher.group() + "]");
}
wordMatcher.appendTail(sb);
System.out.println(sb.toString()); // 『[Java]と[Python]は人気の言語です。』と出力されます。

// Java 9以降: replaceAll() にラムダ式で動的置換を行います。
Matcher m3 = Pattern.compile("\\d+").matcher("値は3で、個数は12です。");
String result = m3.replaceAll(mr -> String.valueOf(Integer.parseInt(mr.group()) * 2));
System.out.println(result); // 『値は6で、個数は24です。』と出力されます。
概要

『replaceAll()』と『replaceFirst()』は Matcher オブジェクトのメソッドで、正規表現に一致した箇所を指定した文字列で置換します。置換文字列には $1$2 のようにキャプチャグループを参照することもできます。

『appendReplacement()』と『appendTail()』を組み合わせると、マッチごとに異なるロジックで置換内容を生成できます。置換文字列に $\ を含む場合は Matcher.quoteReplacement() でエスケープする必要があります。

パターンのコンパイルと基本的なマッチングには『Pattern.compile() / Matcher.matches() / find()』を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。