Java Pattern クラス

Java におけるPatternクラスは正規表現機能の中心的なコンポーネントの1つであり、java.util.regexパッケージに属します。

正規表現(Regular Expression)は、文字列内の特定のパターンをマッチング、検索、置換するための強力なテキスト処理ツールです。

Patternクラスの主な役割は、正規表現をパターン(Pattern)にコンパイルし、後続の効率的なマッチング操作を可能にすることです。


正規表現の概要

正規表現は、文字列パターンを記述するための構文です。特定の記号とルールを使用することで、複雑な文字列マッチングルールを定義できます。例:

  • \d任意の数字にマッチ( と同等)[0-9])
  • \w任意の英字、数字、アンダースコアにマッチ( と同等)[a-zA-Z0-9_])
  • a+1つ以上の連続する英字にマッチa
  • ^文字列の先頭にマッチ
  • $文字列の末尾にマッチ

Pattern クラスの基本的な使い方

Pattern オブジェクトの作成

Patternクラスにはパブリックコンストラクタがなく、静的メソッドcompile()を使用してインスタンスを作成します:

例

import java.util.regex.Pattern;

// 正規表現をコンパイル
Pattern pattern = Pattern.compile("a*b");

よく使うメソッド

matcher(CharSequence input)

を作成し、Matcherそのオブジェクトは、入力文字列に対するマッチング操作に使用します:

例

Matcher matcher = pattern.matcher("aaaab");

matches(String regex, CharSequence input)

静的メソッドで、入力文字列が正規表現に完全にマッチするかどうかを直接判定します:

例

boolean isMatch = Pattern.matches("a*b", "aaaab"); // true を返す

split(CharSequence input)

正規表現に基づいて入力文字列を分割します:

例

String[] parts = pattern.split("aaaabtest"); // ["", "test"] を返す

正規表現のフラグ(Flags)

正規表現をコンパイルする際に、さまざまなフラグを指定してマッチング動作を変更できます:

フラグ 説明
Pattern.CASE_INSENSITIVE 大文字と小文字を無視
Pattern.MULTILINE マルチラインモード、^と$各行の先頭と末尾にマッチ
Pattern.DOTALL .改行文字を含むすべての文字にマッチ
Pattern.UNICODE_CASE Unicode 対応の大文字小文字フォールディングを有効にする

使用例:

例

// 大文字と小文字を無視してマッチ
Pattern pattern = Pattern.compile("a*b", Pattern.CASE_INSENSITIVE);

Pattern クラスの実際の応用

メールアドレスの形式検証

例

String emailRegex = "^[\\w-]+(\\.[\\w-]+)*@[\\w-]+(\\.[\\w-]+)+$";
Pattern emailPattern = Pattern.compile(emailRegex);

String email = "[email protected]";
boolean isValid = emailPattern.matcher(email).matches();

数字の抽出

例

String text = "Price: $123.45";
Pattern numberPattern = Pattern.compile("\\d+\\.?\\d*");
Matcher matcher = numberPattern.matcher(text);

if (matcher.find()) {
    String number = matcher.group(); // "123.45"
}

文字列の置換

例

String input = "Hello, my phone is 123-456-7890";
Pattern phonePattern = Pattern.compile("\\d{3}-\\d{3}-\\d{4}");
String output = phonePattern.matcher(input).replaceAll("[PHONE]");
// 出力: "Hello, my phone is [PHONE]"

パフォーマンス最適化のアドバイス

  1. 正規表現のプリコンパイル:複数回使用する必要がある正規表現は、あらかじめPatternオブジェクトにコンパイルし、毎回使用時に再コンパイルしないようにします。

  2. 過度に複雑な正規表現を避ける:過度に複雑な正規表現はパフォーマンスの低下を招き、「壊滅的なバックトラッキング」問題が発生する可能性があります。

  3. グループを適切に使用する:非キャプチャグループ(?:...)はキャプチャグループよりも(...)パフォーマンスが優れています。内容をキャプチャする必要がない場合は、非キャプチャグループを使用してください。


まとめ

Patternクラスは Java 正規表現機能の中核であり、強力な文字列パターンマッチング機能を提供します。 を適切に使用することでPatternクラスとそれに付随するMatcherクラスを使用すると、さまざまな文字列処理タスクを効率的に完了できます。正規表現と を習得することでPatternクラスの使用は、開発者のテキスト処理能力を大幅に向上させます。

以下の表に、Patternクラスのよく使うメソッドを示します:

構築とコンパイルメソッド

メソッド 説明
static Pattern compile(String regex) 正規表現を Pattern オブジェクトにコンパイルする
static Pattern compile(String regex, int flags) 指定されたフラグで正規表現をコンパイルする
static boolean matches(String regex, CharSequence input) 正規表現をすばやくマッチング(コンパイル+マッチング)
static String quote(String s) 文字列をリテラルパターンに変換する(すべての特殊文字をエスケープ)

フラグ定数(よく使うもの)

フラグ 説明
Pattern.CASE_INSENSITIVE 大文字と小文字を区別しないマッチング
Pattern.MULTILINE マルチラインモード(^と$が行頭と行末にマッチ)
Pattern.DOTALL ドット(.)が行終端文字を含むすべての文字にマッチ
Pattern.UNICODE_CASE Unicode 対応の大文字小文字フォールディングを有効にする

マッチングと分割メソッド

メソッド 説明
Matcher matcher(CharSequence input) マッチャーオブジェクトを作成する
String[] split(CharSequence input) パターンで入力文字列を分割する
String[] split(CharSequence input, int limit) 制限回数付きの分割
Stream<String> splitAsStream(CharSequence input) 分割後のストリームを返す(Java 8+)

パターン情報メソッド

メソッド 説明
String pattern() コンパイルされた正規表現を返す
int flags() コンパイル時に設定されたフラグを返す
String toString() パターンの文字列表現を返す
その他の拡張