1. 導入:なぜ正規表現が重要なのか
プログラミングをしていると、「特定の形式の文字列(メールアドレスや電話番号など)を抽出したい」「複雑な条件で文字列を置換したい」という場面に必ず遭遇します。Javaの標準機能であるjava.util.regexパッケージを使えば、これらを非常に簡潔かつ強力に処理できます。今回は、Javaで正規表現を扱うための要であるPatternとMatcherについて解説します。
2. 基礎知識:PatternとMatcherの役割
Javaの正規表現は、主に以下の2つのクラスで完結します。
Pattern(パターン)クラス
正規表現の「設計図」です。まず文字列として書かれた正規表現をコンパイルし、パターンオブジェクトを作成します。
Matcher(マッチャー)クラス
パターンを特定の文字列に適用する「エンジン」です。マッチングの判定、検索、置換など、実際の処理はすべてこのクラスが行います。
Named Groups(名前付きグループ)
正規表現の中で括弧()を使ってグループ化する際、インデックス番号ではなく「名前」を付けて管理する機能です。コードの可読性が飛躍的に向上するため、特に複雑なパターンを扱う際に重宝します。
3. 実装と解決策
正規表現を扱う手順は以下の通りです。
1. 正規表現を文字列として定義する。
2. Pattern.compile()でパターンオブジェクトを作成する。
3. matcher()メソッドで対象文字列からマッチャーを作成する。
4. find()やreplaceAll()などのメソッドで処理を実行する。
4. サンプルプログラム
名前付きグループを使用して、日付文字列から「年」「月」「日」を抽出する実用的なコードです。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexSample {
public static void main(String[] args) {
// 対象の文字列(日付形式)
String text = "今日は2023-10-27です。";
// 名前付きグループ(?<名前>...)を使用して正規表現を定義
String regex = "(?
// パターンのコンパイル
Pattern pattern = Pattern.compile(regex);
// マッチャーの作成
Matcher matcher = pattern.matcher(text);
// マッチするか確認
if (matcher.find()) {
// 名前を指定して抽出
String year = matcher.group("year");
String month = matcher.group("month");
String day = matcher.group("day");
System.out.println("年: " + year);
System.out.println("月: " + month);
System.out.println("日: " + day);
}
}
}
5. 応用・注意点:現場で役立つアドバイス
・パフォーマンスへの配慮
Patternのコンパイルは負荷がかかる処理です。ループの中で毎回 Pattern.compile() を呼び出すと処理速度が大幅に低下します。再利用可能なパターンは、クラスのstatic finalな定数として定義しましょう。
・バックスラッシュ(\)の扱いに注意
Javaの文字列リテラル内では「\」自身がエスケープ文字となるため、正規表現の「\d」(数値)を表現するには「\\d」と記述する必要があります。ここが初心者の方が最も躓きやすいポイントですので、注意してください。
・過信しない
非常に便利な正規表現ですが、複雑にしすぎると「誰にも読めないコード」になります。簡単な文字列操作であれば、String.substring()やString.split()の方が高速で保守性が高い場合もあります。道具は適材適所で使い分けましょう。

コメント