Javaの正規表現入門|PatternとMatcherの使い方

先生

Javaの正規表現をマスターして、文字列操作の達人になろう!PatternとMatcherを使いこなせば、複雑なパターンも自由自在。

Javaの正規表現とは?基本を理解しよう

Javaの正規表現は、文字列のパターンマッチングを行うための強力なツールです。特定のパターンに合致する文字列を検索、置換、抽出する際に非常に役立ちます。例えば、メールアドレスの形式が正しいか、電話番号が特定のパターンに合致するかなどを検証できます。

Javaでは、java.util.regexパッケージに正規表現を扱うためのクラスが用意されています。主なクラスはPatternMatcherです。Patternクラスは正規表現パターンをコンパイルし、Matcherクラスはコンパイルされたパターンを使って文字列とのマッチングを行います。

Patternクラス:正規表現パターンのコンパイル

Patternクラスは、正規表現パターンをコンパイルして、Matcherオブジェクトを作成するために使用されます。Pattern.compile()メソッドを使って正規表現文字列をコンパイルします。

import java.util.regex.Pattern;

public class PatternExample {
    public static void main(String[] args) {
        // 正規表現パターンをコンパイル
        Pattern pattern = Pattern.compile("Java");

        // パターンを使ってMatcherオブジェクトを作成
        // (この時点ではマッチングは行われません)
        System.out.println("Pattern compiled: " + pattern.pattern());
    }
}

上記の例では、Javaという文字列にマッチするパターンをコンパイルしています。pattern()メソッドでコンパイルしたパターンを確認できます。

Matcherクラス:文字列とのマッチング

Matcherクラスは、Patternクラスでコンパイルされた正規表現パターンを使って、文字列とのマッチングを行います。Matcherオブジェクトは、Pattern.matcher()メソッドで作成します。

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

public class MatcherExample {
    public static void main(String[] args) {
        // 正規表現パターンをコンパイル
        Pattern pattern = Pattern.compile("Java");

        // マッチング対象の文字列
        String text = "Java is a programming language. Java is popular.";

        // Matcherオブジェクトを作成
        Matcher matcher = pattern.matcher(text);

        // マッチングを行う
        while (matcher.find()) {
            System.out.println("Found match at: " + matcher.start() + " - " + matcher.end());
        }
    }
}

この例では、find()メソッドを使って、文字列中にJavaというパターンが見つかるかどうかを検索しています。start()メソッドとend()メソッドは、マッチした文字列の開始位置と終了位置を返します。

Matcherクラスには、他にも様々なメソッドがあります。matches()メソッドは、文字列全体がパターンにマッチするかどうかを判定します。lookingAt()メソッドは、文字列の先頭がパターンにマッチするかどうかを判定します。replaceFirst()メソッドとreplaceAll()メソッドは、マッチした文字列を置換します。

正規表現の特殊文字とメタ文字

正規表現では、特殊な意味を持つ文字(メタ文字)がいくつかあります。これらのメタ文字を組み合わせることで、複雑なパターンを表現できます。

代表的なメタ文字:

. (ドット): 任意の1文字にマッチします。

* (アスタリスク): 直前の文字の0回以上の繰り返しにマッチします。

+ (プラス): 直前の文字の1回以上の繰り返しにマッチします。

? (クエスチョンマーク): 直前の文字の0回または1回の出現にマッチします。

[] (ブラケット): ブラケット内のいずれかの文字にマッチします。例: [abc] は a, b, c のいずれかにマッチします。

() (丸括弧): グループ化のために使用されます。グループ化された部分は後で参照できます。

\d: 任意の数字にマッチします。

\w: 任意の英数字(a-z, A-Z, 0-9, _)にマッチします。

\s: 任意の空白文字(スペース、タブ、改行など)にマッチします。

// 例:メールアドレスのパターン
// \w+ は1つ以上の英数字、\.+はドット、-はハイフン、@はアットマークを表す
String emailRegex = "[\\w\\.-]+@\\w+\\.\\w+";

上記は非常に単純な例ですが、メタ文字を組み合わせることで、より複雑なパターンを定義できます。

エスケープ処理の重要性

正規表現でメタ文字そのものを検索したい場合は、エスケープ処理が必要です。エスケープ処理は、メタ文字の前にバックスラッシュ \ を付けることで行います。ただし、Javaの文字列リテラル内では、バックスラッシュ自体もエスケープする必要があるため、\\ と記述します。

// ドット(.)そのものを検索する場合
String text = "example.com";
Pattern pattern = Pattern.compile("example\\.com");
Matcher matcher = pattern.matcher(text);
if (matcher.find()) {
    System.out.println("Match found!");
}

参考リンク

まとめ

Javaの正規表現は、文字列処理において非常に強力なツールです。PatternクラスとMatcherクラスを理解し、メタ文字を効果的に活用することで、複雑なパターンマッチングを簡単に行うことができます。今回の記事で、正規表現の基本的な使い方を理解し、日々の開発に役立ててください。