Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaの文字列置換メソッド徹底解説:replace()・replaceAll()・replaceFirst()の使い方

Javaで文字列を扱う際、「特定の単語を別の単語に置き換えたい」「正規表現に一致する部分だけを変換したい」といったニーズはよく発生します。Stringクラスには、こうした用途に応えるためにreplace()replaceAll()replaceFirst()という3つの置換メソッドが用意されています。

この記事では、それぞれのメソッドの特徴と違いを、実際のコード例と実行結果をもとにわかりやすく解説します。

replace()メソッドとは

replace()メソッドは、Stringクラスの基本的な置換メソッドで、2つの引数を受け取ります。

  • 1つ目:置き換えの対象となる部分文字列
  • 2つ目:置き換え後の新しい文字列

このメソッドを使うと、文字列内に含まれる指定した部分文字列をすべて別の文字列に置き換えることができます。

コード例(文字列の置換)

以下の例では、テキストファイルを読み込み、その内容に含まれる「Tutorialspoint」を「TP」に置き換えています。

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class ReplaceExample {
    public static void main(String args[]) throws FileNotFoundException {
        String filePath = "D://input.txt";
        Scanner sc = new Scanner(new File(filePath));
        StringBuffer sb = new StringBuffer();
        String input;
        while (sc.hasNextLine()) {
            input = sc.nextLine();
            sb.append(input);
        }
        String contents = sb.toString();
        System.out.println("ファイルの内容:\n" + contents);
        System.out.println(" ");

        // 単語を目的の文字列に置き換え
        contents = contents.replace("Tutorialspoint", "TP");
        System.out.println("置換後のファイルの内容:\n" + contents);
    }
}

実行結果

ファイルの内容:
Hello how are you welcome to Tutorialspoint. At Tutorialspoint provide hundreds of technical tutorials for free.

置換後のファイルの内容:
Hello how are you welcome to TP. At TP provide hundreds of technical tutorials for free.

ご覧のとおり、文中の「Tutorialspoint」がすべて「TP」に置き換えられています。

コード例(文字の置換)

replace()メソッドには、char型の引数を2つ受け取るオーバーロード版もあります。この場合、1つ目の引数で指定した既存の文字を、2つ目の引数の新しい文字で、文字列全体に対して一括置換します。

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class ReplaceExample {
    public static void main(String args[]) throws FileNotFoundException {
        String filePath = "D://input.txt";
        Scanner sc = new Scanner(new File(filePath));
        StringBuffer sb = new StringBuffer();
        String input;
        while (sc.hasNextLine()) {
            input = sc.nextLine();
            sb.append(input);
        }
        String contents = sb.toString();
        System.out.println("ファイルの内容:\n" + contents);
        System.out.println(" ");

        // 文字'T'を'#'に置き換え
        contents = contents.replace('T', '#');
        System.out.println("置換後のファイルの内容:\n" + contents);
    }
}

実行結果

ファイルの内容:
Hello how are you welcome to Tutorialspoint. At Tutorialspoint provide hundreds of technical tutorials for free.

置換後のファイルの内容:
Hello how are you welcome to #utorialspoint. At #utorialspoint provide hundreds of technical tutorials for free.

大文字の「T」だけが「#」に置き換わり、小文字の「t」はそのまま残っている点に注目してください。これはreplace()メソッドが大文字・小文字を区別するためです。

replaceAll()メソッドとは

replaceAll()メソッドは、正規表現を使って文字列を置換したい場合に便利なメソッドです。次の2つの引数を受け取ります。

  • 1つ目:マッチングに使用する正規表現パターン
  • 2つ目:置き換え後の文字列(またはパターン)

正規表現に一致したすべての箇所が、指定した文字列に置き換えられます。

コード例

ここでは、単語境界を表す正規表現「\bTutorialspoint\b」を使用して、「Tutorialspoint」という単語だけを正確に「TP」へ置き換えています。

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class ReplaceAllExample {
    public static void main(String args[]) throws FileNotFoundException {
        String filePath = "D://input.txt";
        Scanner sc = new Scanner(new File(filePath));
        StringBuffer sb = new StringBuffer();
        String input;
        while (sc.hasNextLine()) {
            input = sc.nextLine();
            sb.append(input);
        }
        String contents = sb.toString();
        System.out.println("ファイルの内容:\n" + contents);
        System.out.println();

        // 正規表現に一致する単語を置き換え
        contents = contents.replaceAll("\\bTutorialspoint\\b", "TP");
        System.out.println("置換後のファイルの内容:\n" + contents);
    }
}

実行結果

ファイルの内容:
Hello how are you welcome to Tutorialspoint. At Tutorialspoint provide hundreds of technical tutorials for free.

置換後のファイルの内容:
Hello how are you welcome to TP. At TP provide hundreds of technical tutorials for free.

replaceFirst()メソッドとは

replaceFirst()メソッドも、replaceAll()と同様に正規表現と置換後の文字列の2つの引数を受け取ります。ただし、大きな違いは最初に一致した1か所だけを置き換えるという点です。2番目以降の一致箇所は変更されません。

コード例

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class ReplaceExample {
    public static void main(String args[]) throws FileNotFoundException {
        String filePath = "D://input.txt";
        Scanner sc = new Scanner(new File(filePath));
        StringBuffer sb = new StringBuffer();
        String input;
        while (sc.hasNextLine()) {
            input = sc.nextLine();
            sb.append(input);
        }
        String contents = sb.toString();
        System.out.println("ファイルの内容:\n" + contents);
        System.out.println(" ");

        // 最初に一致した単語のみ置き換え
        contents = contents.replaceFirst("Tutorialspoint", "TP");
        System.out.println("置換後のファイルの内容:\n" + contents);
    }
}

実行結果

ファイルの内容:
Hello how are you welcome to Tutorialspoint. At Tutorialspoint provide hundreds of technical tutorials for free.

置換後のファイルの内容:
Hello how are you welcome to TP. At Tutorialspoint provide hundreds of technical tutorials for free.

実行結果を見ると、1つ目の「Tutorialspoint」だけが「TP」に変わっており、2つ目は元のままになっていることが確認できます。

3つのメソッドの比較まとめ

メソッド引数置換範囲
replace()文字列またはchar同士一致したすべての箇所
replaceAll()正規表現+置換文字列一致したすべての箇所
replaceFirst()正規表現+置換文字列最初に一致した1か所のみ

注意点

重要:これら3つのメソッドはすべて大文字・小文字を区別します。「Java」と「java」は別の文字列として扱われるため、大文字小文字を無視して置換したい場合は、事前にtoLowerCase()などで文字列を統一してから処理を行うか、正規表現でPattern.CASE_INSENSITIVEフラグを活用する方法があります。

また、Stringクラスはイミュータブル(不変)であるため、これらのメソッドは元の文字列を変更せず、置換結果を含む新しい文字列を返す点にも注意しましょう。戻り値を必ず変数に代入して使用してください。

  1. JavaのStringIndexOutOfBoundsExceptionとは?発生原因と対処法をわかりやすく解説

    StringIndexOutOfBoundsExceptionとはJavaにおいて、文字列(String)は一連の文字を格納するために使用され、オブジェクトとして扱われます。文字列は、java.langパッケージに含まれるStringクラスによって表現されます。文字列の作成方法は主に2つあります。1つは他のオブジェクトと同様にnewキーワードを使用する方法、もう1つはプリミティブ型のようにリテラルを直接代入する方法です。String stringObject = new String(Hello how are you); String stringLiteral = Welcome to T

  2. Java 8のインターフェースで使える静的メソッドの基本と実践例

    Java 8におけるインターフェースの静的メソッドとはJava 8以降、インターフェースには静的メソッド(staticメソッド)を定義できるようになりました。これにより、ユーティリティ的なヘルパーメソッドをインターフェース内に直接記述でき、関連する処理をひとまとめに管理しやすくなります。静的メソッドは「インターフェース名.メソッド名()」の形式で呼び出すのが基本です。実装クラスのインスタンスからは直接呼び出せず、オーバーライドもできない点に注意しましょう。静的メソッドを持つインターフェースの定義例次の例では、Vehicleインターフェースにデフォルトメソッド print() と、静的メソッド