【Java学習|豆知識】Java正規表現の極意:Matcher.group(int)で特定のデータを抽出する

導入

システム開発において、ログ解析や文字列のパースは避けて通れない作業です。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以降では、(?…)という構文で「名前付きグループ」が使えます。group(“name”)のように名前で取得できるため、グループ数が多い場合や、後から正規表現を変更する可能性がある場合は、番号指定よりもコードの可読性が格段に向上します。ぜひ併せて覚えておいてください。

コメント

タイトルとURLをコピーしました