Regex.Matchメソッドが正規表現にマッチする最初の箇所を返すのに対し、Regex.Matchesメソッドはマッチする全ての箇所を返します。
Matchesメソッドはマッチする全ての箇所をMatchクラスのコレクション型MatchCollectionで返します。 このコレクションを列挙することにより、マッチした個々の箇所に対応するMatchインスタンスを参照することができます。 マッチする箇所がなければ、空のコレクションが返されます。
次のコードでは、正規表現を使って文字列中に含まれる4文字以上の単語をすべて探索し、表示しています。
(この例で用いている正規表現\w{4,}
は、「アルファベット・かな・漢字などの文字(\w
)が、4文字以上続く({4,}
)箇所」を表します。)
using System;
using System.Text.RegularExpressions;
class Sample {
static void Main()
{
var text = "The quick brown fox jumps over the lazy dog すばしっこい 茶色の 狐は のろまな 犬を 飛び越える";
// 正規表現にマッチする箇所をすべて取得する
var matches = Regex.Matches(text, @"\w{4,}");
// マッチした箇所をひとつずつ列挙して表示する
// (MatchCollectionは非ジェネリックで型指定されていないIEnumeratorを返すため、varによる暗黙的な型指定はできない)
foreach (Match m in matches) {
Console.WriteLine("{0,-10} ({1}, {2})", m.Value, m.Index, m.Length);
}
}
}
quick (4, 5) brown (10, 5) jumps (20, 5) over (26, 4) lazy (35, 4) すばしっこい (44, 6) のろまな (58, 4) 飛び越える (66, 5)
Matchインスタンスからマッチ結果を取得する方法については§.マッチ箇所の探索 (Regex.Match)を参照してください。
MatchCollectionは当初、非ジェネリックなIEnumerableのみを実装した型指定されていないコレクションとして登場し、その後.NET Standard 2.1/.NET Core 2.0にてIEnumerable<Match>/ICollection<Match>/IList<Match>を実装するようになり、型指定されたコレクションとして扱うことができるようになっています。
一方、IEnumerable<Match>の実装以降でも、MatchCollection.GetEnumeratorメソッドは(おそらく)互換性のため型指定されていないIEnumeratorを返す実装のままとなっています。 このため、MatchCollectionをforeachで列挙する場合、var
による暗黙的な型指定を行うとobject
として列挙されます。
代替手法やMatchCollectionのジェネリックインターフェイスについてより詳しくは正規表現の構造化および処理(マッチ・グループ・キャプチャ) §.MatchCollection・GroupCollection・CaptureCollectionとジェネリックコレクションインターフェイスを参照してください。