導入
システム開発において、ログ解析や文字列のパースは避けて通れない作業です。Javaの正規表現において、単に「マッチするかどうか」だけでなく、「マッチした文字列の一部を切り出したい」という場面は非常に多いはずです。今回解説するMatcher.group(int)は、そんな「抽出」の課題を解決する非常に重要かつ基礎的なテクニックです。
基礎知識
正規表現において、括弧 () で囲った部分は「キャプチャグループ」と呼ばれます。JavaのMatcherクラスでは、マッチした全体をグループ0、左から順に現れる括弧をグループ1、グループ2…と番号を振って管理しています。
例えば、「(A)(B)」という正規表現に対し「AB」という文字列をマッチさせると、以下のようになります。
・group(0): “AB”(全体)
・group(1): “A”
・group(2): “B”
この番号を指定して取得することで、複雑な文字列の中から必要なパーツだけをピンポイントで抜き出すことが可能になります。
実装/解決策
具体的な手順は以下の通りです。
1. Pattern.compile()で正規表現をコンパイルする。
2. matcher()メソッドでMatcherオブジェクトを作成する。
3. find()メソッドでマッチングを実行する。
4. マッチした状態でgroup(int)を呼び出し、特定のグループを取得する。
サンプルプログラム
以下のコードは、日付フォーマット(YYYY-MM-DD)から年・月・日を個別に抽出する例です。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexExample {
public static void main(String[] args) {
// 日付形式を判定し、年・月・日をグループ化する正規表現
String regex = “(\\d{4})-(\\d{2})-(\\d{2})”;
String target = “本日の日付は 2023-10-27 です。”;
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(target);
// find()でマッチ箇所を探す
if (matcher.find()) {
// group(0)は全体、1は年、2は月、3は日
System.out.println(“全体: ” + matcher.group(0));
System.out.println(“年: ” + matcher.group(1));
System.out.println(“月: ” + matcher.group(2));
System.out.println(“日: ” + matcher.group(3));
} else {
System.out.println(“マッチしませんでした。”);
}
}
}
応用・注意点
現場で活用する際の重要な注意点を2つ挙げます。
1. IndexOutOfBoundsExceptionに注意: 存在しないグループ番号(例えばマッチした正規表現に括弧が1つしかないのにgroup(2)を呼ぶなど)を指定すると、実行時例外が発生します。必ずgroupCount()メソッドでグループの総数を確認するか、正規表現の構造を把握してから呼び出すようにしてください。
2. 名前付きグループの活用: Java 7以降では、(?

コメント