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

【Java】正規表現で別の一致結果の中からさらに一致を見つける方法

Javaの正規表現(java.util.regex)を使って、あるパターンに一致した文字列の中から、さらに別のパターンに一致する部分を抽出したい場合があります。このような「入れ子のマッチング」を実現するには、まず外側のパターンに一致する正規表現をコンパイルしてマッチを見つけ、その結果(group()で取得した文字列)を、内側のMatcherオブジェクトへの入力として渡します。

処理の流れ

手順は以下のとおりです。

  1. 外側のパターンを Pattern.compile() でコンパイルし、対象文字列に対して Matcher を作成する。
  2. find() メソッドで外側のパターンに一致する部分を順番に検索する。
  3. group() メソッドで一致した文字列(キャプチャグループ)を取得する。
  4. 取得した文字列を入力として、内側のパターンの Matcher を新しく生成する。
  5. 内側の Matcher に対して再度 find() を実行し、目的の部分文字列を抽出する。

サンプルコード

次の例では、HTMLの タグで囲まれた部分(外側のパターン)を検索し、その中から数字の並び(内側のパターン)を抽出しています。

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

public class MatcherExample {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter input text: ");
        String input = sc.nextLine();

        // 外側のパターン:<b>タグで囲まれた部分
        String regexOuter = "<b>(.*?)</b>";
        // 内側のパターン:1桁以上の数字
        String regexInner = "\\d+";

        // パターンオブジェクトを作成
        Pattern patternOuter = Pattern.compile(regexOuter);
        Pattern patternInner = Pattern.compile(regexInner);

        // コンパイルしたパターンで文字列をマッチング
        Matcher outerMatcher = patternOuter.matcher(input);
        while (outerMatcher.find()) {
            // 外側の一致結果(グループ1)を内側のMatcherに入力として渡す
            Matcher innerMatcher = patternInner.matcher(outerMatcher.group(1));
            while (innerMatcher.find()) {
                System.out.println(innerMatcher.group());
            }
        }
    }
}

実行結果

Enter input text:
This is sample HTML data <b>123 sample text</b> hello
123

コードのポイント

外側のパターン「<b>(.*?)</b>」は、<b>タグと</b>タグに挟まれた任意の文字列をキャプチャグループ1として取得します。「.*?」は最短一致(控えめな量指定子)なので、複数のタグが存在しても正しく各ブロックを切り分けられます。

内側のパターン「\\d+」は、1桁以上の連続した数字に一致します。ここでは外側の group(1) の結果を matcher() に渡して新しい Matcher を生成している点が重要です。これにより、「一致の中の一致」という入れ子構造の検索が可能になります。

なお、実際のHTML解析にはJsoupなどの専用ライブラリを使うのが望ましいですが、単純なテキスト処理や学習目的であれば、このようにMatcherを二段階に分ける手法が有効です。

  1. Javaの正規表現におけるサブ式(グループ化)の使い方

    Javaの正規表現において、サブ式(メタ文字)( )は、複数の正規表現をひとつのグループにまとめ、マッチしたテキストを記憶する働きを持ちます。グループ化を活用すると、選択(|)の適用範囲を限定したり、マッチした一部分の文字列を後から取り出したりできるようになります。 例1:基本的なグループ化 import java.util.regex.Matcher; import java.util.regex.Pattern; public class Example { public static void main(String args[]) { String input =

  2. Javaの正規表現で文字列から数値を抽出する方法

    Javaの正規表現(Regular Expression)を使えば、文字列の中から数値だけを簡単に取り出すことができます。この記事では、実際のコード例とともに、さまざまなパターンでの数値抽出の方法を解説します。文字列を解析し、必要な情報を抜き出すスキルは、テスターにとって欠かせない能力の一つです。特にAPIテストでは、JSONやXML形式のレスポンスを解析する場面が多く、正規表現の知識が大いに役立ちます。以下では、Javaの正規表現を使って文字列から数字・数値を抽出する具体的な例を紹介します。文字列からすべての数値を抽出するimport java.util.regex.Matcher; imp