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を超えるようなテキストを解析する場合は、タイムアウト時間を指定するオーバーロードメソッドの利用などを検討してください。
