Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaの正規表現におけるキャプチャグループとは?意味と使い方を実例で解説

正規表現とは

正規表現とは、専用の構文で記述されたパターンをもとに、特定の文字列や文字列の集合を検索・照合するための特別な表現方法です。Javaでは java.util.regex パッケージに含まれる Pattern クラスと Matcher クラスを利用することで、正規表現による柔軟な文字列処理を実現できます。

キャプチャグループの意味

正規表現におけるキャプチャグループとは、複数の文字やサブパターンをひとつの単位として扱うための機能です。グループは丸括弧「( )」で表され、括弧の中に複数のサブパターンを記述すると、それらはひとつのグループとして認識されます。

たとえば、パターン [0-9] は 0〜9 のいずれかの数字1文字にマッチし、{5} は直前のパターンの5回の繰り返しを表します。これらを組み合わせて ([0-9]{5}) と記述すれば、「5桁の数字」全体をひとつのグループとしてマッチさせることができます。

さらに、マッチしたグループは Matcher クラスの group() メソッドで後から取り出せます。group(0) はマッチした文字列全体を、group(1) 以降は左から順番に各グループが捕捉した部分を返します。

例1:日付形式のバリデーション

次の例では、キャプチャグループを使って月と日の範囲を定義し、MM/DD/YYYY 形式の日付が有効かどうかを判定しています。あわせて Pattern.COMMENTS フラグを指定すると、正規表現の中にコメントを記述できるため、複雑なパターンの可読性が向上します。

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

public class DateValidationExample {
   public static void main(String[] args) {
      Scanner sc = new Scanner(System.in);
      System.out.println("名前を入力してください:");
      String name = sc.nextLine();
      System.out.println("生年月日を入力してください(MM/DD/YYYY):");
      String dob = sc.nextLine();

      // MM/DD/YYYY 形式の日付を受け付ける正規表現
      String regex = "^(1[0-2]|0[1-9])/    # 月\\n"
         + "(3[01]|[12][0-9]|0[1-9])/ # 日\\n"
         + "[0-9]{4}$                 # 年";

      // Patternオブジェクトの生成
      Pattern pattern = Pattern.compile(regex, Pattern.COMMENTS);
      // Matcherオブジェクトの生成
      Matcher matcher = pattern.matcher(dob);
      boolean result = matcher.matches();

      if(result) {
         System.out.println("入力された生年月日は有効です");
      } else {
         System.out.println("入力された生年月日は無効です");
      }
   }
}

実行結果

名前を入力してください:
Krishna
生年月日を入力してください(MM/DD/YYYY):
09/26/1989
入力された生年月日は有効です

例2:グループごとにマッチ結果を取得する

次の例では、3つのキャプチャグループを含むパターン (.*)(\d+)(.*) を使い、文字列から各グループに対応する部分を個別に取り出しています。

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

public class GroupTest {
   public static void main(String[] args) {
      String regex = "(.*)(\\d+)(.*)";
      String input = "This is a sample Text, 1234, with numbers in between.";

      // Patternオブジェクトの生成
      Pattern pattern = Pattern.compile(regex);
      // 文字列に対してコンパイル済みパターンを適用
      Matcher matcher = pattern.matcher(input);

      if(matcher.find()) {
         System.out.println("マッチ全体:" + matcher.group(0));
         System.out.println("第1グループ:" + matcher.group(1));
         System.out.println("第2グループ:" + matcher.group(2));
         System.out.println("第3グループ:" + matcher.group(3));
      }
   }
}

実行結果

マッチ全体:This is a sample Text, 1234, with numbers in between.
第1グループ:This is a sample Text, 123
第2グループ:4
第3グループ:, with numbers in between.

この出力では、.* が貪欲(greedy)に動作するため、第1グループが「123」までを捕捉し、第2グループは残りの「4」だけを捕捉しています。貪欲マッチの挙動を理解しておくと、意図しない抽出結果を防ぐことができます。

まとめ

キャプチャグループを使うことで、正規表現にマッチした文字列の一部を部分的に抽出できます。入力値のバリデーションだけでなく、ログ解析やデータ抽出など実務のさまざまな場面で役立つ機能なので、ぜひ使いこなしましょう。

  1. JavaのStringIndexOutOfBoundsExceptionとは?発生原因と対処法をわかりやすく解説

    StringIndexOutOfBoundsExceptionとはJavaにおいて、文字列(String)は一連の文字を格納するために使用され、オブジェクトとして扱われます。文字列は、java.langパッケージに含まれるStringクラスによって表現されます。文字列の作成方法は主に2つあります。1つは他のオブジェクトと同様にnewキーワードを使用する方法、もう1つはプリミティブ型のようにリテラルを直接代入する方法です。String stringObject = new String(Hello how are you); String stringLiteral = Welcome to T

  2. JavaのArrayIndexOutOfBoundsExceptionとは?発生原因と対処法を解説

    配列とインデックスの基本 配列(Array)とは、同じ型の要素を固定サイズで順番に格納するためのデータ構造(コンテナ/オブジェクト)です。配列のサイズ(長さ)は生成時に決定され、後から変更することはできません。 配列内の各要素の位置は「インデックス(添字)」と呼ばれます。Javaの配列は0始まりのため、最初の要素はインデックス0、2番目の要素はインデックス1、というように順に番号が割り当てられます。 配列の各要素へは、「配列名[インデックス]」という形式の式を使ってアクセスします。 System.out.println(myArray[3]); // 1457 が出力される たとえばサイズ7