【Java】MatchResultインターフェースのstart(int group)メソッドをサンプル付きで解説
java.util.regex.MatchResultインターフェースは、正規表現によるマッチ処理の結果を取得するためのメソッド群を提供します。
このインターフェースのオブジェクトは、MatcherクラスのtoMatchResult()メソッドを使って取得できます。このメソッドは、現在のマッチャーが保持しているマッチ状態を表すMatchResultオブジェクトを返します。
start(int group)メソッドは、キャプチャリンググループの番号を表す整数を引数として受け取り、直前のマッチ操作において指定されたグループがマッチした部分文字列の先頭インデックス(オフセット)を返します。
サンプルコード
import java.util.Scanner;
import java.util.regex.MatchResult;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Example {
public static void main(String args[]) {
String regex = "(.*)(\\d+)(.*)";
// ユーザーからの入力を読み込む
Scanner sc = new Scanner(System.in);
System.out.println("Enter input text: ");
String input = sc.nextLine();
// Patternクラスのインスタンス化
Pattern pattern = Pattern.compile(regex);
// Matcherクラスのインスタンス化
Matcher matcher = pattern.matcher(input);
// マッチが発生したかどうかを確認
if (matcher.find()) {
System.out.println("Match found");
}
MatchResult res = matcher.toMatchResult();
int start = res.start(2);
System.out.println(start);
}
}
実行結果
Enter input text: This is a sample Text, 123 Match found 25
処理の流れと解説
このプログラムでは、正規表現「(.*)(\d+)(.*)」を入力テキスト「This is a sample Text, 123」に適用しています。
量指定子「*」は貪欲(greedy)に動作するため、第1グループはできる限り多くの文字を取り込もうとします。その結果、第1グループは「This is a sample Text, 12」までを消費し、第2グループ(\d+)は末尾の数字「3」のみにマッチします。
したがって、res.start(2)が返す値は、第2グループにマッチした文字「3」の開始インデックスである25となります。
使用時の注意点
start(int group)メソッドを呼び出す際には、以下の点に注意が必要です。
- マッチが一度も試行されていない、または直前のマッチ操作が失敗している状態で呼び出すと、
IllegalStateExceptionがスローされます。 - パターン内に存在しないグループ番号を指定すると、
IndexOutOfBoundsExceptionがスローされます。
そのため、サンプルのようにmatcher.find()などでマッチの成否を確認してから呼び出すのが安全な書き方です。
-
例で学ぶJava Matcherクラスのpattern()メソッド
java.util.regex.Matcher クラスは、正規表現による各種マッチ操作を実行するエンジンを表すクラスです。このクラスにはコンストラクタが用意されていないため、java.util.regex.Pattern クラスの matcher() メソッドを使用してオブジェクトを生成・取得します。 pattern() メソッドは、現在の Matcher が解釈に使用している Pattern オブジェクトを取得して返します。引数は不要で、戻り値は java.util.regex.Pattern 型です。「実際にどの正規表現で照合を行ったのか」を後から確認したい場合などに便利なメソッドです。
-
JavaのMatcherクラスstart()メソッドとは?サンプルコード付きで解説
java.util.regex.Matcherクラスは、正規表現を用いたさまざまなマッチ操作を実行するエンジンを表すクラスです。このクラスにはコンストラクタが用意されておらず、java.util.regex.Patternクラスのmatcher()メソッドを使用することで、Matcherオブジェクトを取得できます。 Matcherクラスのstart()メソッドは、直前にマッチした文字列の開始インデックス(先頭からの位置)をint型で返します。 start()メソッドの基本的な動作 正規表現における文字クラス「[...]」は、括弧内に指定したいずれか1文字に一致します。以下の例では、この文字クラ