0Pricing
Java Academy · レッスン

キャプチャグループ

マッチした部分文字列を取り出します。

「キャプチャグループ」はCoddyKit上の無料Java Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJava Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Java Academyコースには全4レッスンが含まれています。

キャプチャグループとは

正規表現内の丸括弧( )はキャプチャグループを作成します。一致した後、各グループのテキストを個別に抽出できるため、構造化データの解析に適しています。

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

public class Main {
    public static void main(String[] args) {
        Matcher m = Pattern.compile("(\\d+)-(\\d+)").matcher("42-99");
        if (m.find()) {
            System.out.println(m.group(1));
            System.out.println(m.group(2));
        }
    }
}

グループ0は一致全体

group(0)(またはgroup())は、一致したテキスト全体を返します。番号付きグループは1から始まります。

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

public class Main {
    public static void main(String[] args) {
        Matcher m = Pattern.compile("(\\d+)px").matcher("width: 24px");
        if (m.find()) {
            System.out.println(m.group(0));
            System.out.println(m.group(1));
        }
    }
}

グループ数の確認

groupCount()は、パターン内のキャプチャグループ数を返します(グループ0は含みません)。

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

public class Main {
    public static void main(String[] args) {
        Matcher m = Pattern.compile("(\\d{4})-(\\d{2})-(\\d{2})").matcher("2026-05-30");
        if (m.find()) System.out.println(m.groupCount());
    }
}

日付の解析

キャプチャグループを使うと、書式化された値を構成要素に簡単に分解できます。

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

public class Main {
    public static void main(String[] args) {
        Matcher m = Pattern.compile("(\\d{4})-(\\d{2})-(\\d{2})").matcher("2026-05-30");
        if (m.matches()) {
            System.out.println("year=" + m.group(1));
            System.out.println("month=" + m.group(2));
            System.out.println("day=" + m.group(3));
        }
    }
}

名前付きグループ

(?<name>...)でグループに名前を付け、名前で取得できます。これにより、パターンがはるかに読みやすくなります。

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

public class Main {
    public static void main(String[] args) {
        Pattern p = Pattern.compile("(?<user>\\w+)@(?<host>\\w+\\.\\w+)");
        Matcher m = p.matcher("alice@example.com");
        if (m.find()) {
            System.out.println(m.group("user"));
            System.out.println(m.group("host"));
        }
    }
}

グループの境界

start(n)とend(n)は、入力内にある特定のグループのインデックス範囲を返します。

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

public class Main {
    public static void main(String[] args) {
        Matcher m = Pattern.compile("(\\d+)").matcher("abc123");
        if (m.find()) {
            System.out.println(m.start(1) + " to " + m.end(1));
        }
    }
}

非キャプチャグループ

(?:...)を使うと、番号付きキャプチャを作成せずに選択や量指定のためのグループ化ができます。これにより、グループ番号を意味のある状態に保てます。

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

public class Main {
    public static void main(String[] args) {
        Matcher m = Pattern.compile("(?:Mr|Ms)\\.? (\\w+)").matcher("Ms. Smith");
        if (m.find()) System.out.println(m.group(1));
    }
}

省略可能なグループはnullになる場合がある

グループが省略可能で、一致時に使われなかった場合、group(n)はnullを返します。必ずこのケースに対応してください。

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

public class Main {
    public static void main(String[] args) {
        Matcher m = Pattern.compile("(\\d+)(px)?").matcher("50");
        if (m.matches()) {
            System.out.println(m.group(1));
            System.out.println(m.group(2));
        }
    }
}

グループを使った一致の反復

findのループとグループの抽出を組み合わせると、より大きなテキストから構造化されたトークンを取り出せます。

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

public class Main {
    public static void main(String[] args) {
        Matcher m = Pattern.compile("(\\w+)=(\\d+)").matcher("a=1 b=2 c=3");
        while (m.find()) {
            System.out.println(m.group(1) + " -> " + m.group(2));
        }
    }
}

パターン内の後方参照

正規表現内の\1は、前のグループがキャプチャしたものと同じテキストに一致します。たとえば、単語の重複を検出できます。

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

public class Main {
    public static void main(String[] args) {
        Matcher m = Pattern.compile("(\\w+) \\1").matcher("the the cat");
        System.out.println(m.find());
        System.out.println(m.group(1));
    }
}

レコードへのキャプチャ

すっきりしたパターンは、一致させ、グループを抽出し、小さなオブジェクトを作成するという流れです。ここではrecordを使用します。

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

public class Main {
    record Point(int x, int y) {}

    public static void main(String[] args) {
        Matcher m = Pattern.compile("\\((\\d+),(\\d+)\\)").matcher("(3,7)");
        if (m.matches()) {
            Point p = new Point(Integer.parseInt(m.group(1)), Integer.parseInt(m.group(2)));
            System.out.println(p);
        }
    }
}

クイックチェック

一致に成功した後、group(0)は何を返しますか。

まとめ

一致した部分文字列を抽出しました。

  • 丸括弧は番号付きグループを作成します。group(0)は一致全体を表し、1以降がキャプチャです。
  • (?<name>...)は名前付きグループを作成し、group("name")で読み取れます。
  • (?:...)はキャプチャせずにグループ化します。
  • 省略可能なグループはnullになることがあり、\1は前のグループを後方参照します。

よくある質問

「キャプチャグループ」レッスンは無料ですか?

はい。「キャプチャグループ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Java Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Java Academyコースには全4レッスンが含まれています。

「キャプチャグループ」で何を学びますか?

マッチした部分文字列を取り出します。 ブラウザで直接実行するハンズオンコードでJava Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Java Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのJava Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「キャプチャグループ」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このJava Academyレッスンでコードを書いて実行できますか?

はい。すべてのJava Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. パターンのコンパイル
  2. 検索とマッチング
  3. キャプチャグループ
  4. 正規表現による置換
← Java Academyに戻る