【Java学習|豆知識】Java正規表現の要!Matcher.find()を活用した文字列検索テクニック

導入

プログラミングにおいて、文字列の中から特定のパターンを探し出す処理は避けて通れません。単純な検索ならStringクラスのcontainsメソッドで十分ですが、複雑な形式(メールアドレス、日付、特定のフォーマットのIDなど)を扱う場合、Javaの正規表現エンジンであるPatternとMatcherが不可欠です。特にMatcher.find()は、文字列全体から「次の一致箇所」を順次検索できるため、反復処理を行う際に非常に強力な武器となります。

基礎知識

Javaで正規表現を扱うには、まずPatternクラスで正規表現をコンパイルし、Matcherクラスで対象の文字列を評価します。
Patternは正規表現のコンパイル済み形式を保持するクラスです。
Matcherは、そのパターンを使って対象の文字列に対してマッチング操作を行うエンジンです。
Matcher.find()は、現在の位置から正規表現に一致する部分文字列を探し、見つかればtrueを返し、内部のインデックスを進めます。これにより、whileループと組み合わせることで文字列内の全一致箇所を網羅的に抽出できます。

実装/解決策

Matcher.find()を使用する際は、whileループの条件式に直接組み込むのが定石です。また、正規表現で「名前付きキャプチャグループ」を使用すると、抽出したデータの管理が非常に楽になります。例えば「(?…)」という記法を使うことで、インデックス番号ではなく名前でマッチした部分を取得できます。

サンプルプログラム

以下のコードは、ログデータから「ID」と「ステータス」を抽出する実用的な例です。

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexSample {
public static void main(String[] args) {
// 検索対象の文字列
String input = “ID:USR001 Status:SUCCESS, ID:USR002 Status:FAIL”;

// 名前付きキャプチャグループを使用した正規表現
// (?…) でIDを、(?…) でステータスを取得
String regex = “ID:(?\\w+)\\s+Status:(?\\w+)”;

Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);

System.out.println(“— 検索開始 —“);

// find()を使って次の一致箇所を順次検索
while (matcher.find()) {
// 名前を指定してグループの値を取得
String id = matcher.group(“id”);
String status = matcher.group(“status”);

System.out.println(“発見: ID=” + id + “, ステータス=” + status);
}
}
}

応用・注意点

現場での開発において注意すべき点は、find()を呼び出す順番です。matcher.group()などの取得メソッドは、必ずfind()がtrueを返した後に呼び出すようにしてください。find()が一度も呼ばれていない、あるいはfalseを返した後にグループを取得しようとすると、IllegalStateExceptionが発生します。

また、頻繁にマッチングを行う場合は、Patternオブジェクトをstatic finalフィールドとして定義し、再利用することを推奨します。コンパイル処理は重い負荷がかかるため、ループ内でのPattern.compile()の乱用はパフォーマンス低下の大きな原因となります。

コメント

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