0Pricing
Java Academy · レッスン

正規表現による置換

replaceAll と後方参照です。

「正規表現による置換」はCoddyKit上の無料Java Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJava Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Java Academyコースには全4レッスンが含まれています。

正規表現による置換

正規表現は検索だけに使うものではなく、テキストの変換にも使えます。replaceAllはすべての一致を置換文字列に置き換えます。

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class Main {
    public static void main(String[] args) {
        Matcher m = Pattern.compile("\\d+").matcher("a1b22c333");
        System.out.println(m.replaceAll("#"));
    }
}

String.replaceAllショートカット

String.replaceAll(regex, replacement)は、内部でパターンをコンパイルする便利な1行の呼び出しです。

public class Main {
    public static void main(String[] args) {
        String cleaned = "hello   world  again".replaceAll("\\s+", " ");
        System.out.println(cleaned);
    }
}

replaceFirst

replaceFirstは最初の一致だけを置き換え、後続の一致はそのまま残します。

public class Main {
    public static void main(String[] args) {
        String s = "cat cat cat".replaceFirst("cat", "dog");
        System.out.println(s);
    }
}

置換でのグループ参照

置換文字列内の$1、$2などは、それぞれのグループがキャプチャしたテキストを挿入します。これにより、一致した内容の順序を入れ替えたり、書式を変更したりできます。

public class Main {
    public static void main(String[] args) {
        String iso = "30/05/2026".replaceAll("(\\d{2})/(\\d{2})/(\\d{4})", "$3-$2-$1");
        System.out.println(iso);
    }
}

名前付きグループの参照

置換では${name}を使って名前付きグループを参照することもできます。

public class Main {
    public static void main(String[] args) {
        String r = "alice@example.com"
            .replaceAll("(?<user>\\w+)@(?<host>[\\w.]+)", "${user} at ${host}");
        System.out.println(r);
    }
}

ドル記号とバックスラッシュのエスケープ

$と\は置換文字列内で特別な意味を持つため、ドル記号そのものを表すには\$とエスケープします。Matcher.quoteReplacementを使えば、自動的にエスケープできます。

import java.util.regex.Matcher;

public class Main {
    public static void main(String[] args) {
        String price = "100".replaceAll("\\d+", Matcher.quoteReplacement("$100"));
        System.out.println(price);
    }
}

replaceAll関数による計算済み置換

Java 9以降では、Matcher.replaceAllに関数を渡し、一致ごとに置換内容を計算できます。

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class Main {
    public static void main(String[] args) {
        Matcher m = Pattern.compile("\\d+").matcher("a1 b2 c3");
        String out = m.replaceAll(mr -> String.valueOf(Integer.parseInt(mr.group()) * 10));
        System.out.println(out);
    }
}

一致した単語を大文字に変換する

置換内容が一致したテキストに依存する場合、たとえば各単語を大文字に変換する場合に、関数形式の利点が発揮されます。

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class Main {
    public static void main(String[] args) {
        Matcher m = Pattern.compile("\\b\\w").matcher("hello there world");
        String title = m.replaceAll(mr -> mr.group().toUpperCase());
        System.out.println(title);
    }
}

appendReplacementとappendTail

完全に制御したい場合は、findをループし、appendReplacement、続いてappendTailを使って出力を組み立てます。これは従来からある低レベルの手法です。

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class Main {
    public static void main(String[] args) {
        Matcher m = Pattern.compile("\\d+").matcher("a1b2");
        StringBuilder sb = new StringBuilder();
        while (m.find()) {
            m.appendReplacement(sb, "[" + m.group() + "]");
        }
        m.appendTail(sb);
        System.out.println(sb);
    }
}

パターン内の後方参照

パターン内の後方参照(\1)は、繰り返されたテキストに一致します。置換時に重複した単語を1つにまとめる場合などに便利です。

public class Main {
    public static void main(String[] args) {
        String fixed = "the the end end".replaceAll("\\b(\\w+) \\1\\b", "$1");
        System.out.println(fixed);
    }
}

不要な文字の除去

よくある用途の1つは、許可された文字の集合に含まれないすべての文字を空文字列に置き換えて、入力をサニタイズすることです。

public class Main {
    public static void main(String[] args) {
        String digits = "(555) 123-4567".replaceAll("[^0-9]", "");
        System.out.println(digits);
    }
}

クイックチェック

replaceAllの置換文字列で、$2は何を意味しますか。

まとめ

正規表現でテキストを変換しました。

  • replaceAllとreplaceFirstは一致を置き換え、Stringにはショートカットが用意されています。
  • $1/${name}は置換文字列にキャプチャグループを挿入します。リテラルの$は\$またはquoteReplacementでエスケープします。
  • replaceAllの関数形式では、一致ごとに置換内容を計算できます。
  • appendReplacementとappendTailを使うと、手動で完全に制御できます。

よくある質問

「正規表現による置換」レッスンは無料ですか?

はい。「正規表現による置換」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Java Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Java Academyコースには全4レッスンが含まれています。

「正規表現による置換」で何を学びますか?

replaceAll と後方参照です。 ブラウザで直接実行するハンズオンコードでJava Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Java Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのJava Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「正規表現による置換」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このJava Academyレッスンでコードを書いて実行できますか?

はい。すべてのJava Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. パターンのコンパイル
  2. 検索とマッチング
  3. キャプチャグループ
  4. 正規表現による置換
← Java Academyに戻る