キャプチャグループ
マッチした部分文字列を取り出します。
「キャプチャグループ」は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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- パターンのコンパイル
- 検索とマッチング
- キャプチャグループ
- 正規表現による置換