【C#】文字列の中からパターンに一致する箇所を「すべて」取得する (Regex.Matches)

Regex.Match が「最初の1つ」だけを取得するのに対し、Regex.Matches メソッドを使用すると、文字列内に含まれるすべての一致箇所をコレクション(リスト)として取得できます。

ログファイルからのデータ抽出や、文章内のタグ解析など、複数のデータを取り出したい場合に必須となるメソッドです。

目次

すべての一致箇所を抽出する実装

以下のサンプルコードでは、商品リストの文字列から、「商品ID(アルファベット1文字-数字3桁)」のパターンに一致するものをすべて探し出し、列挙しています。

サンプルコード

using System;
using System.Text.RegularExpressions;

public class Program
{
    public static void Main()
    {
        // 解析対象のデータ(複数のIDが含まれている文字列)
        string data = "在庫確認: Item [A-101], Item [B-205], Item [Z-999] (以上3点)";

        Console.WriteLine($"対象データ: {data}\n");

        // ---------------------------------------------------------
        // パターン1: 条件に合う部分をすべて取り出す
        // ---------------------------------------------------------
        // [A-Z] : 大文字アルファベット1文字
        // -     : ハイフン
        // \d{3} : 数字3桁
        // 上記にマッチするすべての箇所を取得する
        MatchCollection matches1 = Regex.Matches(data, @"[A-Z]-\d{3}");

        Console.WriteLine($"--- 単純抽出 (発見数: {matches1.Count}) ---");
        
        // MatchCollection は foreach でループ処理が可能
        foreach (Match m in matches1)
        {
            Console.WriteLine($"ID発見: {m.Value}");
        }

        Console.WriteLine();

        // ---------------------------------------------------------
        // パターン2: グループ化 () を使って、IDの中の「数字部分」だけを抜く
        // ---------------------------------------------------------
        // Item\s+\[ : "Item" + 空白 + "["
        // ([A-Z]-\d{3}) : (グループ1) ID全体をキャプチャ
        // \] : "]"
        MatchCollection matches2 = Regex.Matches(data, @"Item\s+\[([A-Z]-\d{3})\]");

        Console.WriteLine("--- グループ抽出 ---");

        foreach (Match m in matches2)
        {
            // Groups[1] で () の中身だけを取得
            // ここでは Item [...] の枠を除いた IDのみ を表示
            Console.WriteLine($"中身のみ: {m.Groups[1].Value}");
        }
    }
}

実行結果

対象データ: 在庫確認: Item [A-101], Item [B-205], Item [Z-999] (以上3点)

--- 単純抽出 (発見数: 3) ---
ID発見: A-101
ID発見: B-205
ID発見: Z-999

--- グループ抽出 ---
中身のみ: A-101
中身のみ: B-205
中身のみ: Z-999

解説と技術的なポイント

1. MatchCollection クラス

Regex.Matches の戻り値は MatchCollection 型です。 これは Match オブジェクトのコレクション(リストのようなもの)であり、以下の特徴があります。

  • foreach で回せる: すべての一致箇所を順番に処理できます。
  • Count プロパティ: 一致した総数を確認できます。
  • インデックスアクセス: matches[0] のように配列としてアクセス可能です。

2. グループ化の活用

Match 単体の時と同様に、Matches で取得した各 Match オブジェクト内でも Groups プロパティが有効です。 これにより、「パターンに一致する行をすべて探し(Matches)、その行の中から特定の値だけを抜き出す(Groups)」という高度な抽出処理が可能になります。

3. パフォーマンスの注意点

非常に長い文字列に対して複雑な正規表現で Matches を実行すると、処理に時間がかかる場合があります。数MBを超えるようなテキストを解析する場合は、タイムアウト時間を指定するオーバーロードメソッドの利用などを検討してください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次