1. 導入: なぜMatcherのメソッドが必要なのか?
Javaで文字列の抽出や検証を行う際、正規表現は非常に強力な武器です。しかし、単に「マッチしたかどうか」を判定するだけでは不十分な場面が多々あります。例えば、「特定のパターンの開始位置と終了位置を知りたい」「抽出されたグループの数がいくつあるのか確認したい」といったケースです。これらを解決するのが、Matcherクラスが提供するgroupCount()、start()、end()メソッドです。これらを使いこなすことで、文字列処理の精度と柔軟性が飛躍的に向上します。
2. 基礎知識: 正規表現とMatcherの役割
Javaでは、正規表現を扱うためにjava.util.regexパッケージの「Pattern」と「Matcher」という2つのクラスを使います。
Patternは正規表現のコンパイル済みの表現であり、Matcherは、そのパターンを特定の入力文字列に対して適用するためのエンジンです。
特に重要なのが「グループ」の概念です。正規表現内で括弧 `()` を使うと、マッチした文字列の一部を「グループ」として保存できます。groupCount()はこのグループの総数を返し、start()とend()は、マッチした部分のインデックス(開始位置と終了位置)を教えてくれます。
3. 実装/解決策: メソッドの使い分け
・groupCount(): パターン内に定義されたキャプチャグループの数を返します。
・start(int group): 指定したグループ番号が開始するインデックスを返します。
・end(int group): 指定したグループ番号の終了インデックス(最後の文字の次の位置)を返します。
これらを組み合わせることで、文字列内の特定の要素がどこに位置しているかを正確に特定できます。
4. サンプルプログラム
以下のコードは、日付フォーマット(年-月-日)から各要素を抽出し、その位置情報を取得する例です。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexExample {
public static void main(String[] args) {
// 対象の文字列とパターン(年-月-日)
String text = "今日は2023-10-27です。";
String regex = "(\\d{4})-(\\d{2})-(\\d{2})";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(text);
if (matcher.find()) {
// groupCount()でグループ数を確認(ここでは年、月、日で3つ)
System.out.println("グループ数: " + matcher.groupCount());
for (int i = 1; i <= matcher.groupCount(); i++) {
// start()とend()で位置情報を取得
int start = matcher.start(i);
int end = matcher.end(i);
String val = matcher.group(i);
System.out.println("グループ" + i + ": " + val +
" [開始: " + start + ", 終了: " + end + "]");
}
}
}
}
5. 応用・注意点: 現場で役立つポイント
・インデックスの指定に注意
group(0)は「マッチした文字列全体」を指します。グループ番号は1から始まりますので、ループ処理を行う際は注意してください。
・例外の回避
グループ番号が存在しないものを指定すると、IndexOutOfBoundsExceptionが発生します。groupCount()の結果を元にループ範囲を制御するのが安全な実装です。
・名前付きグループの活用
Java 7以降では、(?

コメント