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

Java MatcherクラスのtoMatchResult()メソッドの使い方(サンプルコード付き)


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

toMatchResult()メソッドは、現在のマッチャーのマッチ状態をMatchResultオブジェクトとして返します。これにより、マッチした文字列やその位置、キャプチャグループの内容といった詳細情報を取得できます。

例1

import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ToMatchResultExample {
    public static void main(String[] args) {
        String str = "<p>This <b>is</b> an <b>example</b>.</p>";
        // 太字タグ(<b>)の中身にマッチする正規表現
        String regex = "<b>(\\S+)</b>";
        // Patternオブジェクトを作成
        Pattern pattern = Pattern.compile(regex);
        System.out.println("State of the matcher: ");
        // 文字列に対してコンパイル済みのパターンでマッチング
        Matcher matcher = pattern.matcher(str);
        while (matcher.find()) {
            System.out.println(matcher.toMatchResult());
            String result = matcher.group(1);
        }
        matcher = matcher.reset("<p>this is another <b>line</b>.</p>");
        matcher.find();
        System.out.println("");
        System.out.println("State of the matcher after resetting it: \n"+matcher.toMatchResult());
    }
}

出力

State of the matcher:
java.util.regex.Matcher[pattern=<b>(\S+)</b> region=0,40 lastmatch=<b>is</b>]
java.util.regex.Matcher[pattern=<b>(\S+)</b> region=0,40 lastmatch=<b>example</b>]

State of the matcher after resetting it:
java.util.regex.Matcher[pattern=<b>(\S+)</b> region=0,35 lastmatch=<b>line</b>]

このプログラムでは、正規表現「<b>(\S+)</b>」を使って、文字列中の太字タグで囲まれた部分を検索しています。find()メソッドで一致が見つかるたびにtoMatchResult()を呼び出し、その時点のマッチ状態を出力します。その後、reset()メソッドで対象文字列を別のものに切り替え、再度マッチングを行った結果も表示しています。

出力結果からは、pattern(適用された正規表現)、region(検索対象となった文字列の範囲)、lastmatch(最後に一致した文字列)といった情報を読み取ることができます。reset()後はregionの範囲が新しい文字列の長さに応じて更新されている点にも注目してください。

例2

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ToMatchResultExample {
    public static void main(String[] args) {
        String regex = "[#]";
        System.out.println("Enter a string: ");
        Scanner sc = new Scanner(System.in);
        String input = sc.nextLine();
        // Patternオブジェクトを作成
        Pattern pattern = Pattern.compile(regex);
        // Matcherオブジェクトを作成
        Matcher matcher = pattern.matcher(input);
        System.out.println("Match state: ");
        // マッチを検索
        while(matcher.find()) {
            System.out.println(matcher.toMatchResult());
        }
    }
}

出力

Enter a string:
#This #is #a #sample #text
Match state:
java.util.regex.Matcher[pattern=[#] region=0,26 lastmatch=#]
java.util.regex.Matcher[pattern=[#] region=0,26 lastmatch=#]
java.util.regex.Matcher[pattern=[#] region=0,26 lastmatch=#]
java.util.regex.Matcher[pattern=[#] region=0,26 lastmatch=#]
java.util.regex.Matcher[pattern=[#] region=0,26 lastmatch=#]

この例では、Scannerを使ってユーザーから文字列を入力してもらい、正規表現「[#]」に一致する文字(#)が見つかるたびにtoMatchResult()でマッチ状態を出力しています。入力文字列に含まれる「#」の個数だけ結果行が出力されることがわかります。

ポイントまとめ

  • toMatchResult()は、呼び出した時点のマッチ状態をMatchResultオブジェクトとして返します。
  • 戻り値のMatchResultに対してgroup()、start()、end()などのメソッドを使えば、マッチの詳細情報を取得できます。
  • find()で一致が見つかった直後に呼び出すことで、その一致に関する状態を正確に把握できます。
  1. JavaのMatcherクラスreplaceFirst()メソッドの使い方とサンプルコード解説

    Javaで正規表現を扱う際、java.util.regex.Matcher クラスは、入力文字列に対してさまざまなマッチ操作を実行する「エンジン」の役割を担います。このクラスにはコンストラクタが用意されておらず、java.util.regex.Pattern クラスの matcher() メソッドを使ってオブジェクトを取得するのが一般的な使い方です。本記事では、Matcherクラスが提供する replaceFirst() メソッドの基本的な使い方を、実際に動作するサンプルコードと実行結果とともにわかりやすく解説します。replaceFirst()メソッドとはreplaceFirst() メソッ

  2. 例で学ぶJava Matcherクラスのpattern()メソッド

    java.util.regex.Matcher クラスは、正規表現による各種マッチ操作を実行するエンジンを表すクラスです。このクラスにはコンストラクタが用意されていないため、java.util.regex.Pattern クラスの matcher() メソッドを使用してオブジェクトを生成・取得します。 pattern() メソッドは、現在の Matcher が解釈に使用している Pattern オブジェクトを取得して返します。引数は不要で、戻り値は java.util.regex.Pattern 型です。「実際にどの正規表現で照合を行ったのか」を後から確認したい場合などに便利なメソッドです。