Gruppen in regulären Ausdrücken sind ein sehr wichtiges Konzept und sie sind unsere Brücke zu fortgeschrittenen Anwendungen für reguläre Ausdrücke.
Das Konzept der Gruppe.
Ein regulärer Ausdrucksübereinstimmungsergebnis kann in mehrere Teile unterteilt werden. Dies ist der Zweck der Gruppe. Nachdem Sie Gruppen flexibel nutzen können, werden Sie feststellen, dass Regex wirklich praktisch und leistungsstark ist.
Nehmen wir zunächst ein Beispiel:
public static void Main()
{
string s = "21.02.2005";
Regex reg = new Regex(@"(?<y>d{4})-(?<m>d{1,2})-(?<d>d{1,2})",RegexOptions .Kompiliert);
Match match = reg.Match(s);
int year = int.Parse(match.Groups["y"].Value);
int Monat = int.Parse(match.Groups["m"].Value);
int day = int .Parse(match.Groups["d"].Value);
DateTime time = new DateTime(year,month,day);
Console.WriteLine(time);
Console.ReadLine();
}
Das obige Beispiel analysiert einen String über Gruppen und konvertiert ihn in eine DateTime-Instanz. Natürlich kann diese Funktion einfach mit der DateTime.Parse-Methode implementiert werden.
In diesem Beispiel verwende ich (?<Name>), um die Ergebnisse eines Matchs in drei Gruppen „y“, „m“ und „d“ zu unterteilen, die jeweils das Jahr, den Monat und den Tag darstellen.
Nachdem wir nun das Konzept der Gruppen kennengelernt haben, schauen wir uns an, wie man sie gruppiert. Zusätzlich zur oben genannten Methode können wir eine Gruppe mit einem Klammerpaar definieren. Das obige Beispiel kann beispielsweise wie folgt geändert werden.
öffentliches statisches void Main()
{
string s = "21.02.2005";
Regex reg = new Regex(@"(d{4})-(d{1,2})-(d{1,2})",RegexOptions.Compiled);
Match match = reg.Match(s);
int year = int.Parse(match.Groups[1].Value);
int Monat = int.Parse(match.Groups[2].Value);
int day = int .Parse(match.Groups[3].Value);
DateTime time = new DateTime(year,month,day);
Console.WriteLine(time);
Console.ReadLine();
}
Wie aus dem obigen Beispiel ersichtlich ist, wird die im ersten Klammerpaar enthaltene Gruppe automatisch mit 1 nummeriert, und die folgenden Klammern werden mit 2, 3 nummeriert ...
public static void Main()
{
string s = "21.02.2005";
Regex reg = new Regex(@"(?<2>d{4})-(?<1>d{1,2})-(?<3>d{1,2})",RegexOptions .Kompiliert);
Match match = reg.Match(s);
int year = int.Parse(match.Groups[2].Value);
int Monat = int.Parse(match.Groups[1].Value);
int day = int .Parse(match.Groups[3].Value);
DateTime time = new DateTime(year,month,day);
Console.WriteLine(time);
Console.ReadLine();
}
obige
Beispiel noch einmal ansehen, verwenden wir (?<Nummer>), um die Gruppe jedes Klammerpaars manuell zu nummerieren (beachten Sie, dass ich die Positionen von 1 und 2 nicht von links nach rechts definiert habe).
Wir kennen die drei Möglichkeiten, eine Gruppe für Regex zu definieren und die entsprechenden Möglichkeiten, auf Gruppen-Matching-Ergebnisse zu verweisen.
Beachten Sie dann bezüglich der Gruppendefinition noch zwei weitere Punkte:
1. Da Klammern zum Definieren von Gruppen verwendet werden, verwenden Sie bitte „(“ und „)“ (über alle, wenn Sie „(“ und „)“ abgleichen möchten speziell (Informationen zur Definition von Zeichen finden Sie in der entsprechenden Hilfedokumentation zu Regex-Ausdrücken).
2. Wenn die Option „ExplicitCapture“ beim Definieren von Regex verwendet wird, ist das zweite Beispiel nicht erfolgreich, da diese Option eine explizit definierte Gruppe mit einer Nummer oder einem Namen erfordert, um die Ergebnisse zu erfassen und zu speichern. Wenn Sie die Option „ExplicitCapture“ nicht definieren, und manchmal Wenn Sie einen Ausdruck definieren, der (A|B) ähnelt, und Sie das Ergebnis dieses Ausdrucks (A|B) nicht erfassen möchten, können Sie die Syntax „nicht erfassende Gruppe“ verwenden, die wie folgt definiert ist ( ?:) Methode für (A|B), Sie können sie wie folgt definieren, um den Zweck zu erreichen, sie nicht in der Gruppensammlung zu erfassen und zu speichern – (?:A|B).