キャプチャとは、グループ化された正規表現にマッチした文字列の一つ一つを表します。 言い換えると、正規表現の部分式にマッチした箇所がキャプチャとなります。
例えば、3桁の数字の連続を表す正規表現(\d{3})+
を考えた場合、この正規表現内のグループ(\d{3})
には量指定子+
があるため、グループ(\d{3})
にマッチする文字列は複数となる場合があります。 この一つ一つがキャプチャとなります。 このように、グループに対して*
, +
や{n}
などの量指定子を指定した場合には、マッチした個々の文字列をキャプチャによって参照することができます。
キャプチャはCaptureクラスで扱います。 Captureクラスは、Groupクラスと同様にRegexクラスやMatchクラスから直接返されることはなく、Group.Capturesプロパティを通じて参照します。
グループ化された正規表現にマッチする箇所が複数ある場合、match.Groupsプロパティは各グループの最後にマッチした箇所=最後のキャプチャを表すGroupを返します。 一方group.Capturesプロパティは、マッチした個々の箇所に対応するCaptureを返します。 グループとは異なり、各キャプチャには0から始まるインデックスが割り当てられます。
Group.Capturesプロパティを参照して正規表現の部分式にマッチした箇所を列挙する
using System;
using System.Text.RegularExpressions;
class Sample {
static void Main()
{
var text = "0123456789";
// 3桁の数字("(\d{3})")がひとつ以上連続("+")する箇所を取得
var m = Regex.Match(text, @"(\d{3})+");
// グループ1の正規表現("(\d{3})")にマッチした文字列を取得して表示
// (最後にマッチした箇所が表示される)
Console.WriteLine(m.Groups[1].Value);
Console.WriteLine();
// グループ1の正規表現にマッチした文字列(=キャプチャ)を列挙して表示
foreach (Capture c in m.Groups[1].Captures) {
Console.WriteLine(c.Value);
}
}
}
実行結果
678 012 345 678