Java
2022.03.25
JavaのString.replaceAllと正規表現で文字列置換!
2023.11.18

Javaのプログラミング学習をするうえで、「replaceAllの使い方がわからない」と悩んでいる方も多いのではないでしょうか。


「replaceAllで文字列を置換するやり方は?」

「正規表現はどうやって書くのだろうか?」


といった疑問に対して、本記事ではJavaのreplaceAllの使い方をサンプルを交えて解説していきます。


※本記事で紹介するサンプルコードは、macOS Montere、OpenJDK-11.0.13で動作確認しています。


1.JavaのreplaceAllとは?

JavaのreplaceAllメソッドは、文字列を検索して条件に一致する部分をすべて置換する機能を持っています。

書式は以下のとおりです。

public String replaceAll(String regex, String replacement)

・regex:一致条件として指定する文字列・正規表現

・replacement:一致するものそれぞれに置換する文字列



2.replaceAllの基本的な使い方


replaceAllメソッドの基本的な使い方について、サンプルコードと共に解説していきます。

①文字列を一括置換する

replaceAllメソッドを使用し、文字列を一括置換するサンプルを紹介します。

public class App {
    public static void main(String[] args) {
        String str = "ABCabcABC";
        str = str.replaceAll("abc", "XY");
        System.out.println(str);
    }
}

実行結果:

ABCXYABC

実行結果を確認すると、文字列の”abc”の箇所が”XY”に置き換わっていることがわかりますね。

②正規表現を使って一括置換する

正規表現とは、文字列の中の「パターン」を表現する記述方法です。replaceAllは正規表現を使ってパターンとマッチした文字列を、指定した文字列へ一括置換できます。


正規表現を使って一括置換するサンプルを紹介します。

public class App {
    public static void main(String[] args) {
        String str = "ABCabcABCdeABCf";
        str = str.replaceAll("[a-z]", "X");
        System.out.println(str);
    }
}

実行結果:

ABCXXXABCXXABCX

replaceAllの最初の引数[a-z]は、”英小文字にマッチするか”を表す正規表現です。


実行結果を確認すると、文字列”ABCabcABCdeABCf”の小文字部分が、すべて”X”に置き換わっていることがわかります。

よく使う正規表現

よく使う正規表現を紹介します。

正規表現意味表現例合致する文字列の例
*0回以上繰り返しa*␣,a,aa,aaa
+1回以上繰り返しab+ab,abab,ababab
?0回 or 1回繰り返しba?␣,ba
^直後の文字が行の先頭にある場合にマッチ^JavaJava Programming
$直前の文字が行の末尾にある場合にマッチPrograming$Java Programming
{N}N回繰り返し(abc){3}abcabcabc
{M,N}M回以上N回以下繰り返しa{2,4}aa,aaa,aaaa
[A-Z]英大文字A-Zの任意1文字にマッチa[A-Z]aA,aB,aX,aY
[a-z]英小文字a-zの任意1文字にマッチb[a-z]ba,bc,bx,by,bz
[0-9]数字0-9の任意1文字にマッチするc[0-9]c1,c9,c0

特殊文字の無効化(エスケープ)

正規表現では*、?、{}、[]など、いくつかの文字を特別な意味として用います。これらの特殊文字を正規表現のパターンで指定したい場合は「\(バックスラッシュ)」を使って無効化(エスケープ)します。


まずは、エスケープしないコードを確認しましょう。

public class App {
    public static void main(String[] args) {
        String str = "Javaではクラスの最初と最後に{}を書きます。";
        str = str.replaceAll("{}", "中括弧");
        System.out.println(str);
    }
}

実行結果:

Exception in thread "main" java.util.regex.PatternSyntaxException: Illegal repetition

このように、エスケープしない書き方をすると、実行時にPatternSyntaxExceptionが発生します。


次にエスケープするコードを確認しましょう。

public class App {
    public static void main(String[] args) {
        String str = "Javaではクラスの最初と最後に{}を書きます。";
        str = str.replaceAll("\\{\\}", "中括弧");
        System.out.println(str);
    }
}

実行結果:

Javaではクラスの最初と最後に中括弧を書きます。

このように、”{”や ” }”を置換する場合は\\でエスケープしましょう。



3.replaceAllの応用的な使い方

ここでは空白の削除やマッチした文字列の参照など、replaceAllメソッドの応用的な使い方を紹介します。

①空白の削除

replaceAllメソッドは空白削除にも使えます。第二引数をブランク(長さ0の文字列)にすれば、空白削除と同じ意味になります。

public class App {
    public static void main(String[] args) {
   String str = "Learn\t Java\n programming";
        str = str.replaceAll("\\s+", "");
        System.out.println(str);
    }
}

実行結果:

LearnJavaprogramming

第一引数に” \\s+”を指定すると、空白を検索します。タブコード(\t)や改行コード(\n)も同時に検索されます。

②マッチした文字列の参照

第一引数で、”()”で囲んだ部分を”$ + 数値”形式で参照できます。

以下にサンプルを記載します。

public class App {
    public static void main(String[] args) {
        String str = "1,115.90";
        str = str.replaceAll("([0-9]+),([0-9]+.[0-9]+)", "$1ドル=$2円");
        System.out.println(str);
    }
}

実行結果:

1ドル=115.90円

正規表現内で()により囲まれた部分を順番に参照できます。$1で最初にマッチした1を置換し、$2で2番目にマッチした115.90を置換したことが確認できますね。



4.さまざまな文字列置換方法


JavaにはreplaceAllメソッド以外にも文字列を置換するメソッドが存在しています。

以下に各メソッドとその特徴を記載します。

メソッド名特徴
replace文字列の一部を別の文字列に置換する
replaceAll文字列を検索して条件に一致する部分をすべて置換する
replaceFirst文字列を検索して最初に一致した部分のみ置換する

①文字列の一部を置換するなら:replace

replaceは文字列の一部を別の文字列に置換するメソッドです。


以下は、電話番号のハイフンを抜くサンプルコードです。

public static void main(String[] args) {
    String str = "090-1234-5678";
    str = str.replace("-", "");
    System.out.println(str);
}

実行結果:

09012345678

実行結果からハイフンが抜かれたことが確認できます。

このように、単純に文字列を置換するならreplaceメソッドがおすすめです。

②条件に一致する文字列をすべて置換するなら:replaceAll

replaceAllは文字列を検索し、条件に一致する部分をすべて置換するメソッドです。


以下のコードは、単語間の連続する複数の半角スペースをひとつに置換するサンプルです。

public class App {
    public static void main(String[] args) {
        String str = "Learn      about   Java's     replaceAll   method";
        str = str.replaceAll("[ ]+", " ");
        System.out.println(str);
    }
}

実行結果:

Learn about Java's replaceAll method

実行結果から、単語間の半角スペースがひとつになったのが確認できますね。

replaceAllメソッドは正規表現を使えるため、複数文字を置換できるので便利です。

③最初のひとつだけ置換するなら:replaceFirst

replaceFirstは、文字列を検索し最初に一致した部分を置換するメソッドです。


以下のサンプルコードは、文字列中にある最初のnullを「8:00」に置換します。

public static void main(String[] args) {
    String str = "2022/2/16,水,null,null";
    str = str.replaceFirst("null", "8:00");
    System.out.println(str);
}

実行結果:

2022/2/16,水,8:00,null

実行結果から、最初のnullだけが「8:00」に置換されているのが確認できます。


この記事をシェア