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

【Java】MatcherクラスのgroupCount()メソッドの使い方をサンプルコードで解説

Javaで正規表現を扱う際、パターン内に定義されたキャプチャグループ(捕捉グループ)の数を知りたい場面があります。そんなときに役立つのが、java.util.regex.MatcherクラスのgroupCount()メソッドです。

本記事では、groupCount()メソッドの基本的な仕組みと、実際に動くサンプルコード2例を通して、その使い方をわかりやすく解説します。

Matcherクラスとは

java.util.regex.Matcherクラスは、正規表現によるさまざまなマッチ操作を実行するエンジンの役割を担うクラスです。

このクラスにはコンストラクタが用意されていないため、インスタンスは直接生成できません。java.util.regex.Patternクラスのmatcher()メソッドを呼び出すことで、Matcherオブジェクトを取得します。

groupCount()メソッドの概要

groupCount()メソッドは、現在マッチ操作に使用している正規表現パターンに含まれるキャプチャグループの総数をint型で返します。

  • 戻り値:パターン内のキャプチャグループの数(int型)
  • マッチ全体を表す「グループ0」はカウントに含まれません
  • 返されるのは「パターンに定義されたグループの数」であり、実際にマッチした回数ではありません

サンプルコード1:基本的なキャプチャグループの取得

まずは、文字列から数字部分を抜き出すシンプルな例を見てみましょう。

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("First group match: "+matcher.group(1));
            System.out.println("Second group match: "+matcher.group(2));
            System.out.println("Third group match: "+matcher.group(3));
            System.out.println("Number of groups capturing: "+matcher.groupCount());
        }
    }
}

実行結果

First group match: This is a sample Text, 123
Second group match: 4
Third group match: , with numbers in between.
Number of groups: 3

解説

使用している正規表現 (.*)(\d+)(.*) には、丸括弧 () によるキャプチャグループが3つ定義されています。

  • 第1グループ(.*) … 数字の直前までの文字列
  • 第2グループ(\d+) … 数字の並び(貪欲マッチのため末尾の「4」のみ)
  • 第3グループ(.*) … 数字以降の残りの文字列

そのため、groupCount()は「3」を返します。各グループのマッチ内容は、group(1)group(3)で個別に取得できます。

サンプルコード2:ネストしたグループを含むパターン

次に、グループが入れ子(ネスト)になっている場合の挙動を確認します。「t」で始まり「t」で終わる単語を抽出する例です。

import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test {
    public static void main(String[] args) {
        String str1 = "<p>This <b>is</b> an <b>example</b>HTML <b>script</b> where <b>ever</b> alternative <b>word</b> is <b>bold</b></p>.";
        // 「t」で始まり「t」で終わる語句に続く空白にマッチする正規表現
        String regex = "(t(\\S+)t)(\\s)";
        String str = "the words tit tat tweet tostff tact that tilt text start and end wit the letter t ";
        // Patternオブジェクトを作成
        Pattern pattern = Pattern.compile(regex);
        // コンパイル済みパターンを文字列に適用
        Matcher matcher = pattern.matcher(str);
        while (matcher.find()) {
            System.out.println(matcher.group(0));
        }
        System.out.println("Total capturing groups: "+matcher.groupCount());
    }
}

実行結果

tit
tat
tweet
tact
that
tilt
text
tart
Total capturing groups: 3

解説

この正規表現 (t(\S+)t)(\s) は、グループが入れ子構造になっています。

  • 第1グループ(t(\S+)t) … 外側のグループ(「t〜t」の部分全体)
  • 第2グループ(\S+) … 内側のグループ(間の空白以外の文字列)
  • 第3グループ(\s) … 後続の空白文字

このように、ネストされたグループもすべて個別のキャプチャグループとしてカウントされるため、groupCount()は「3」を返します。なお、ループ内で出力しているgroup(0)はマッチ全体を表す特殊なグループであり、groupCount()の対象には含まれない点にも注意してください。

まとめ

  • Matcherクラスはコンストラクタを持たず、Pattern.matcher()経由で取得する
  • groupCount()はパターン内のキャプチャグループの総数を返す
  • マッチ全体を示すグループ0はカウント対象外
  • ネストしたグループもそれぞれ独立してカウントされる

正規表現を動的に組み立てる場合や、グループの内容を順番に処理したい場合などに、groupCount()メソッドは非常に便利です。ぜひ活用してみてください。

  1. JavaのMatcher.matches()メソッドとは?使い方をサンプルコード付きで解説

    java.util.regex.Matcherクラスは、正規表現を用いたさまざまなマッチ操作を実行するエンジンを表すクラスです。このクラスにはコンストラクタが用意されておらず、java.util.regex.Patternクラスのmatcher()メソッドを使ってオブジェクトを取得します。 matches()メソッドは、対象の文字列全体が、Patternオブジェクトの作成時に指定された正規表現パターンと一致するかどうかを判定します。一致する場合はtrueを返し、一致しない場合はfalseを返します。重要なポイントとして、このメソッドがtrueを返すためには、検索対象の領域全体がパターンに一致し

  2. JavaのMatcherクラスstart()メソッドとは?サンプルコード付きで解説

    java.util.regex.Matcherクラスは、正規表現を用いたさまざまなマッチ操作を実行するエンジンを表すクラスです。このクラスにはコンストラクタが用意されておらず、java.util.regex.Patternクラスのmatcher()メソッドを使用することで、Matcherオブジェクトを取得できます。 Matcherクラスのstart()メソッドは、直前にマッチした文字列の開始インデックス(先頭からの位置)をint型で返します。 start()メソッドの基本的な動作 正規表現における文字クラス「[...]」は、括弧内に指定したいずれか1文字に一致します。以下の例では、この文字クラ