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

Java MatcherクラスのreplaceAll()メソッドの使い方と実例解説

java.util.regex.Matcher クラスは、正規表現によるさまざまなマッチング操作を実行するエンジンを表すクラスです。このクラスにはコンストラクタが用意されておらず、java.util.regex.Pattern クラスの matcher() メソッドを使ってオブジェクトを取得します。

Matcher クラスが持つ replaceAll() メソッドは、文字列を引数として受け取り、入力文字列内で正規表現にマッチしたすべての部分文字列を、指定した文字列に置き換えた結果を返します。

replaceAll()メソッドの基本構文

public String replaceAll(String replacement)

引数には置換後の文字列を指定し、戻り値として置換処理が完了した新しい文字列が返されます。元の入力文字列自体は変更されない点に注意してください。

例1: 特殊文字の一括置換

次の例では、入力されたテキストから特殊文字(# % & *)を検出してカウントし、それらすべてを「!」に置き換えています。

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ReplaceAllExample {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter input text: ");
        String input = sc.nextLine();
        String regex = "[#%&*]";
        // Patternオブジェクトを作成
        Pattern pattern = Pattern.compile(regex);
        // Matcherオブジェクトを作成
        Matcher matcher = pattern.matcher(input);
        int count = 0;
        while(matcher.find()) {
            count++;
        }
        // 特殊文字の数を出力
        System.out.println("The are "+count+" special characters [# % & *] in the given text");
        // すべての特殊文字 [# % & *] を ! に置き換え
        String result = matcher.replaceAll("!");
        System.out.println("Replaced all special characters [# % & *] with !: \n"+result);
    }
}

実行結果

Enter input text:
Hello# How # are# you *& welcome to T#utorials%point
The are 7 special characters [# % & *] in the given text
Replaced all special characters [# % & *] with !:
Hello! How ! are! you !! welcome to T!utorials!point

この例では、まず find() メソッドをループさせて特殊文字の出現回数を数えています。その後 replaceAll() を呼び出すことで、マッチした7つの特殊文字すべてが「!」に一括置換されました。

例2: 連続する空白を1つのスペースにまとめる

正規表現 \s+ を使うと、「1つ以上の連続した空白文字」にマッチさせることができます。これを利用して、不規則な空白を含むテキストを整形する例を紹介します。

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ReplaceAllExample {
    public static void main(String args[]) {
        // ユーザーから文字列を読み込む
        System.out.println("Enter a String");
        Scanner sc = new Scanner(System.in);
        String input = sc.nextLine();
        // 1つ以上の空白にマッチする正規表現
        String regex = "\\s+";
        // 正規表現をコンパイル
        Pattern pattern = Pattern.compile(regex);
        // Matcherオブジェクトを取得
        Matcher matcher = pattern.matcher(input);
        // すべての連続空白を半角スペース1つに置き換え
        String result = matcher.replaceAll(" ");
        System.out.print("Text after removing unwanted spaces: \n"+result);
    }
}

実行結果

Enter a String
hello   this   is a sample text with irregular spaces
Text after removing unwanted spaces:
hello this is a sample text with irregular spaces

まとめ

  • Matcher.replaceAll() は、パターンにマッチしたすべての部分を指定した文字列に置き換えるメソッドです。
  • 最初の1箇所だけを置き換えたい場合は、代わりに replaceFirst() メソッドを使用します。
  • 置換後の文字列内では $n を使ってキャプチャグループを参照できるため、柔軟な文字列変換が可能です。

テキストのクリーニングやデータ整形など、文字列処理の場面で非常に役立つメソッドなので、ぜひ活用してみてください。

  1. JavaのMatcher.matches()メソッドとは?使い方をサンプルコード付きで解説

    java.util.regex.Matcherクラスは、正規表現を用いたさまざまなマッチ操作を実行するエンジンを表すクラスです。このクラスにはコンストラクタが用意されておらず、java.util.regex.Patternクラスのmatcher()メソッドを使ってオブジェクトを取得します。 matches()メソッドは、対象の文字列全体が、Patternオブジェクトの作成時に指定された正規表現パターンと一致するかどうかを判定します。一致する場合はtrueを返し、一致しない場合はfalseを返します。重要なポイントとして、このメソッドがtrueを返すためには、検索対象の領域全体がパターンに一致し

  2. JavaのMatcherクラスstart()メソッドとは?サンプルコード付きで解説

    java.util.regex.Matcherクラスは、正規表現を用いたさまざまなマッチ操作を実行するエンジンを表すクラスです。このクラスにはコンストラクタが用意されておらず、java.util.regex.Patternクラスのmatcher()メソッドを使用することで、Matcherオブジェクトを取得できます。 Matcherクラスのstart()メソッドは、直前にマッチした文字列の開始インデックス(先頭からの位置)をint型で返します。 start()メソッドの基本的な動作 正規表現における文字クラス「[...]」は、括弧内に指定したいずれか1文字に一致します。以下の例では、この文字クラ