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

JavaのMatcherクラスgroup()メソッドの使い方を例付きで解説

java.util.regex.Matcher クラスは、正規表現を使ったさまざまなマッチ操作を実行するエンジンを表すクラスです。このクラスには公開されたコンストラクタは存在せず、java.util.regex.Pattern クラスの matcher() メソッドを呼び出してオブジェクトを取得します。

Matcher クラスの group() メソッドは、直前に行われたマッチ処理で一致した入力シーケンス(部分文字列)を返します。引数を指定しない場合はマッチした全体を、整数引数を指定した場合は対応するキャプチャグループの内容を取得できます。

group()メソッドの主な形式

  • group():直前のマッチで一致した部分文字列全体を返します。
  • group(int group):指定した番号のキャプチャグループに一致した部分文字列を返します。グループには左から順に1から番号が割り当てられ、group(0) は常にマッチ全体を表します。

例1:HTMLタグ内の単語を抽出する

次の例では、正規表現を使ってHTML文字列の中から <b> タグおよび <i> タグで囲まれた単語をすべて取り出しています。

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

public class GroupExample {
    public static void main(String[] args) {
        String str = "<p>This <b>is</b> an <b>example</b> HTML <b>script</b> "
                + "where <b>every</b> alternative <b>word</b> is <b>bold</b>. "
                + "It <i>also</i> contains <i>italic</i> words</p>";
        // bタグ・iタグの内容に一致させる正規表現
        String regex = "<b>(\\S+)</b>|<i>(\\S+)</i>";
        // Patternオブジェクトを作成
        Pattern pattern = Pattern.compile(regex);
        // 文字列に対してパターンでマッチングを実行
        Matcher matcher = pattern.matcher(str);
        while (matcher.find()) {
             System.out.println(matcher.group());
        }
    }
}

実行結果

<b>is</b>
<b>example</b>
<b>script</b>
<b>every</b>
<b>word</b>
<b>bold</b>
<i>also</i>
<i>italic</i>

find() メソッドがマッチを検出するたびにループが回り、その都度 group() メソッドが一致した部分(タグごと一致した文字列)を返して出力しています。このように group() を使うことで、マッチした箇所を1つずつ順番に取り出せます。

例2:キャプチャグループを指定して取得する

group() メソッドには、キャプチャグループの番号を表す整数を受け取る形式もあります。キャプチャグループは正規表現内の括弧「( )」に対応し、左から右へ向かって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("match: " + matcher.group(0));
             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));
        }
    }
}

実行結果

match: This is a sample Text, 1234, with numbers in between.
First group match: This is a sample Text, 123
Second group match: 4
Third group match: , with numbers in between.

この例の正規表現「(.*)(\\d+)(.*)」には3つのキャプチャグループがあります。group(0) はマッチした文字列全体、group(1) は最初の括弧に一致した部分、group(2) は数字部分、group(3) は最後の括弧に一致した部分を返します。なお、「.*」は貪欲マッチ(できるだけ長く一致しようとする動作)のため、group(1) が「123」までを含み、group(2) が最後の1桁「4」となる点に注意してください。

このように group(int) メソッドを使うと、マッチ結果全体ではなく、必要な特定の部分だけを簡単に取り出すことができます。テキスト解析やデータ抽出の処理で非常に役立つメソッドなので、ぜひ活用してみてください。

  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文字に一致します。以下の例では、この文字クラ