正規表現のグループは非常に重要な概念であり、高度な正規表現アプリケーションへの架け橋となります。
グループの概念。
正規表現の一致結果を複数の部分に分割することができます。これがグループの目的です。グループを柔軟に使用できるようになると、正規表現が本当に便利で強力であることがわかります。
まず例を見てみましょう:
public static void Main()
{
文字列 s = "2005-2-21";
Regex reg = new Regex(@"(?<y>d{4})-(?<m>d{1,2})-(?<d>d{1,2})",RegexOptions .コンパイル済み);
一致 match = reg.Match(s);
int year = int.Parse(match.Groups["y"].Value);
int month = int.Parse(match.Groups["m"].Value);
int day = int .Parse(match.Groups["d"].Value);
DateTime 時間 = new DateTime(年,月,日);
Console.WriteLine(時間);
Console.ReadLine();
、
グループを通じて文字列を分析し、DateTime インスタンスに変換しています。もちろん、この関数は DateTime.Parse メソッドを使用して簡単に実装できます。
この例では、(?<name>) を使用して、Match の結果を、それぞれ年、月、日を表す 3 つのグループ「y」、「m」、および「d」に分割します。
グループの概念がわかったので、グループ化する方法を見てみましょう。上記の方法に加えて、たとえば、上の例を次のように変更できます。
パブリック静的 void Main()
{
文字列 s = "2005-2-21";
Regex reg = new Regex(@"(d{4})-(d{1,2})-(d{1,2})",RegexOptions.Compiled);
一致 match = reg.Match(s);
int year = int.Parse(match.Groups[1].Value);
int month = int.Parse(match.Groups[2].Value);
int day = int .Parse(match.Groups[3].Value);
DateTime 時間 = new DateTime(年,月,日);
Console.WriteLine(時間);
Console.ReadLine();
、
最初の括弧ペアに含まれるグループには自動的に 1 の番号が付けられ、後続の括弧には 2、3... の番号が付けられます。
public static void Main()
{
文字列 s = "2005-2-21";
Regex reg = new Regex(@"(?<2>d{4})-(?<1>d{1,2})-(?<3>d{1,2})",RegexOptions .コンパイル済み);
一致 match = reg.Match(s);
int year = int.Parse(match.Groups[2].Value);
int month = int.Parse(match.Groups[1].Value);
int day = int .Parse(match.Groups[3].Value);
DateTime 時間 = new DateTime(年,月,日);
Console.WriteLine(時間);
Console.ReadLine();
と
、(?<number>) を使用して各括弧ペアのグループに手動で番号を付けています (上記の 3 つの例では、
1 と 2 の位置を左から右に定義していないことに注意してください)。
正規表現のグループを定義する 3 つの方法と、グループの一致結果を参照する対応する方法を理解しています。
次に、グループ定義に関して、さらに 2 つの点に注意してください。
1. グループの定義には括弧が使用されるため、「(」と「)」を一致させたい場合は、「(」と「)」を使用してください (ほぼすべて特別な文字の定義については、関連する正規表現のヘルプ ドキュメントを確認してください)。
2. Regex の定義時に ExplicitCapture オプションが使用されている場合、2 番目の例は成功しません。これは、このオプションでは、結果をキャプチャして保存するために、番号または名前を持つ明示的に定義されたグループが必要になるためです。ExplicitCapture オプションを定義しないと、場合によっては成功しません。 (A|B) に類似した式を定義し、この (A|B) の結果をキャプチャしたくない場合は、次のように定義される「非キャプチャ グループ」構文を使用できます。 ?:) メソッド (A|B) については、グループ コレクション (?:A|B) にキャプチャして保存しないという目的を達成するために、次のように定義できます。