Javaの正規表現グルーピングの具体例

Javaの正規表現グルーピングの具体例

このページでは、Javaでの正規表現のグルーピングに関する詳しい解説と、多くの具体例を示します。それぞれの見出しにはページ内リンクが設定されていますので、目的の内容にジャンプできます。

正規表現のグルーピングとは

正規表現のグルーピングは、文字列のパターンを括弧 () で囲むことで、その部分を1つの単位として扱う技法です。グルーピングを利用することで、次のような操作が可能になります。

  • 文字列の特定部分をキャプチャ(保存)する。
  • 繰り返しやオプションの対象を限定する。
  • キャプチャした部分を後で再利用する。

基本的な使い方

正規表現の基本的なグルーピングの使用方法は次の通りです。

String regex = "(\\d{4})-(\\d{2})-(\\d{2})";
String input = "2024-12-21";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);

if (matcher.matches()) {
    System.out.println("Year: " + matcher.group(1));
    System.out.println("Month: " + matcher.group(2));
    System.out.println("Day: " + matcher.group(3));
}

このコードでは、() を使って年、月、日を個別のグループとしてキャプチャしています。それぞれのグループは matcher.group(index) を使用して取得できます。

グループキャプチャの例

グループキャプチャは文字列内の特定部分を保存し、後で利用するために用います。例えば:

String regex = "(hello)\\s(world)";
String input = "hello world";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);

if (matcher.matches()) {
    System.out.println("First Group: " + matcher.group(1)); // hello
    System.out.println("Second Group: " + matcher.group(2)); // world
}

非キャプチャグループ

正規表現の一部をグループ化したいが、キャプチャは不要な場合には非キャプチャグループ (?:...) を使用します。

String regex = "hello (?:world|universe)";
String input1 = "hello world";
String input2 = "hello universe";

Pattern pattern = Pattern.compile(regex);

System.out.println(pattern.matcher(input1).matches()); // true
System.out.println(pattern.matcher(input2).matches()); // true

名前付きキャプチャグループ

Java 9以降では、名前付きキャプチャグループが利用可能です。グループに名前を付けることで、可読性が向上します。

String regex = "(?<year>\\d{4})-(?<month>\\d{2})-(?<day>\\d{2})";
String input = "2024-12-21";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);

if (matcher.matches()) {
    System.out.println("Year: " + matcher.group("year"));
    System.out.println("Month: " + matcher.group("month"));
    System.out.println("Day: " + matcher.group("day"));
}

グループ参照

キャプチャしたグループを再利用する場合は、正規表現内で \\nn はグループ番号)を使用します。

String regex = "(\\w+)\\s+\\1";
String input = "hello hello";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);

if (matcher.matches()) {
    System.out.println("Matched: " + matcher.group(0)); // hello hello
}

入れ子のグループ

グループは入れ子構造を取ることもできます。外側から順番に番号が付与されます。

String regex = "((\\d{4})-(\\d{2})-(\\d{2}))";
String input = "2024-12-21";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);

if (matcher.matches()) {
    System.out.println("Entire Date: " + matcher.group(1)); // 2024-12-21
    System.out.println("Year: " + matcher.group(2)); // 2024
    System.out.println("Month: " + matcher.group(3)); // 12
    System.out.println("Day: " + matcher.group(4)); // 21
}

実践的な例

最後に、より実践的な正規表現の例をいくつか示します。

// Emailアドレスのパース
String regex = "(\\w+)@(\\w+\\.\\w+)";
String input = "example@example.com";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);

if (matcher.matches()) {
    System.out.println("Username: " + matcher.group(1)); // example
    System.out.println("Domain: " + matcher.group(2)); // example.com
}

// 電話番号のパース
String regexPhone = "\\((\\d{3})\\)\\s(\\d{3})-(\\d{4})";
String inputPhone = "(123) 456-7890";
Pattern patternPhone = Pattern.compile(regexPhone);
Matcher matcher = patternPhone.matcher(inputPhone);

if (matcher.matches()) {
    System.out.println("Area Code: " + matcher.group(1)); // 123
    System.out.println("Exchange: " + matcher.group(2)); // 456
    System.out.println("Line Number: " + matcher.group(3)); // 7890
}

これらの例を参考に、正規表現グルーピングを活用してみてください。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です