TOC

This article has been localized into German by the community.

Regulärer Ausdruck (Regex):

Suchen mit der "Regex" -Klasse

Wie im vorherigen Artikel beschrieben, können Sie mit Regular Expressions Suchmuster für das Arbeiten mit Strings definieren. Um dieses Suchmuster zu verarbeiten, enthält das .NET-Framework eine sehr vielseitige Klasse: Die Regex-Klasse. In diesem Artikel werden wir einige Suchmuster definieren und sie mit der Regex-Klasse verwenden, aber bedenken Sie bitte, dass die Syntax von Regulären Ausdrücken ziemlich kompliziert sein kann und dass dies ein C# -Tutorial und kein Regex-Tutorial ist. Stattdessen werde ich einige einfache Regex-Muster verwenden, um zu demonstrieren, wie Sie in C# mit ihnen arbeiten. Wenn Sie mehr über Regulärer Ausdruck erfahren möchten, kann ich Ihnen dieses Regular Expression Tutorial empfehlen.

Die IsMatch() -Methode

In diesem ersten Beispiel verwende ich eine der grundlegendsten Methoden der Regex-Klasse namens IsMatch. Es gibt einfach wahr oder falsch zurück, abhängig davon, ob ein oder mehrere Übereinstimmungen in der Testzeichenfolge gefunden wurden:

string testString = "John Doe, 42 years";
Regex regex = new Regex("[0-9]+");
if (regex.IsMatch(testString))
    Console.WriteLine("String contains numbers!");
else
    Console.WriteLine("String does NOT contain numbers!");

Wir definieren eine Testzeichenfolge und dann erstellen wir eine Instanz der Regex-Klasse. Wir übergeben den eigentlichen Regulären Ausdruck als String - in diesem Fall gibt der Regex an, dass wir nach einer Zahl beliebiger Länge suchen. Wir geben dann eine Textzeile aus, abhängig davon, ob die Regex eine Übereinstimmung für unsere Testzeichenfolge ist. Ziemlich cool, aber in den meisten Fällen willst du etwas mit dem gefilterten Ergebnis (den Matches) machen - dafür haben wir die Match-Klasse.

Die Match-Klasse & Methode

In diesem nächsten Beispiel werden wir die in der Testzeichenfolge gefundene Nummer erfassen und dem Benutzer präsentieren, anstatt nur zu überprüfen, ob sie da ist:

string testString = "John Doe, 42 years";
Regex regex = new Regex("[0-9]+");
Match match = regex.Match(testString);
if (match.Success)
    Console.WriteLine("Number found: " + match.Value);

Wir verwenden die gleiche Regex und Testzeichenfolge wie zuvor. Ich rufe die Match() Methode auf, die eine Instanz der Match-Klasse zurückgibt - dies geschieht unabhängig davon, ob eine Übereinstimmung gefunden wird oder nicht. Um sicherzustellen, dass eine Übereinstimmung gefunden wurde, überprüfe ich die Eigenschaft Success (Erfolg). Sobald ich sicher bin, dass eine Übereinstimmung gefunden wurde, verwende ich die Eigenschaft Value, um sie abzurufen.

Die Match-Klasse enthält mehr nützliche Informationen als nur die übereinstimmende Zeichenfolge. Sie können beispielsweise leicht herausfinden, wo die Übereinstimmung gefunden wurde, wie lange sie ist und so weiter:

string testString = "John Doe, 42 years";
Regex regex = new Regex("[0-9]+");
Match match = regex.Match(testString);
if (match.Success)
    Console.WriteLine("Match found at index " + match.Index + ". Length: " + match.Length);

Die Eigenschaften Index und Length werden hier verwendet, um Informationen zum Ort und zur Länge der Übereinstimmung anzuzeigen.

Gruppen erfassen

In den ersten paar Beispielen haben wir gerade einen einzigen Wert in unserer Suchzeichenkette gefunden, aber Reguläre Ausdrücke können natürlich viel mehr als das! Zum Beispiel können wir sowohl den Namen als auch das Alter in unserer Testzeichenfolge finden, während wir die irrelevanten Dinge wie den Befehl und den "Jahr" -Text aussortieren. Solche Sachen zu machen ist für reguläre Ausdrücke ein Kinderspiel, aber wenn Sie nicht mit der Syntax vertraut sind, scheint es sehr kompliziert zu sein, lassen Sie es uns trotzdem versuchen:

string testString = "John Doe, 42 years";
Regex regex = new Regex(@"^([^,]+),\s([0-9]+)");
Match match = regex.Match(testString);
if (match.Success)
    Console.WriteLine("Name: " + match.Groups[1].Value + ". Age: " + match.Groups[2].Value);

Ich habe die Regex so geändert, dass sie nach allem Ausschau hält, das kein Komma ist - dieser Wert wird dank der umgebenden Klammern in die erste Erfassungsgruppe gestellt. Dann sucht es nach dem trennenden Komma und danach nach einer Zahl, die in die zweite Fanggruppe gelegt wird (wiederum dank der umgebenden Klammern). In der letzten Zeile verwende ich die Groups-Eigenschaft, um auf die übereinstimmenden Gruppen zuzugreifen. Ich benutze Index 1 für den Namen und 2 für das Alter, da es der Reihenfolge folgt, in der die Match-Gruppen in der Regex-Zeichenfolge definiert wurden (Index 0 enthält die gesamte Übereinstimmung).

Benannte Erfassungsgruppen

Sobald die Regex weiter/länger wird als die, die wir gerade verwendet haben, können nummerierte Capture-Gruppen unkontrollierbar werden, da Sie sich ständig an die Reihenfolge und den Index von ihnen erinnern müssen. Glücklicherweise unterstützen Reguläre Ausdrücke und das .NET-Framework benannte Erfassungsgruppen, mit denen Sie jeder Gruppe einen Namen in der Regex geben und dann in der Groups-Eigenschaft darauf verweisen können. Sehen Sie sich dieses neu geschriebene Beispiel an, in dem wir benannte Gruppen anstelle von nummerierten verwenden:

string testString = "John Doe, 42 years";
Regex regex = new Regex(@"^(?<name>[^,]+),\s(?<age>[0-9]+)");
Match match = regex.Match(testString);
if (match.Success)
    Console.WriteLine("Name: " + match.Groups["name"].Value + ". Age: " + match.Groups["age"].Value);

Es funktioniert genau wie zuvor, aber Sie können jetzt logische Namen verwenden, um die übereinstimmenden Werte zu suchen, anstatt sich den korrekten Index merken zu müssen. Dies ist vielleicht kein großer Unterschied in unserem einfachen Beispiel, aber wie bereits erwähnt, werden Sie es sicherlich zu schätzen wissen, wenn Ihre Regulären Ausdrücke an Komplexität und Länge zunehmen.

Die übereinstimmende Sammel-Klasse

Die "Match-Klasse" ist der richtige Weg, wenn Sie nur mit einer einzelnen Übereinstimmung arbeiten möchten (denken Sie daran, dass eine Übereinstimmung mehrere Werte enthalten kann, wie wir in den vorherigen Beispielen gesehen haben), aber manchmal möchten Sie mit mehreren Übereinstimmungen gleichzeitig arbeiten. Dafür haben wir die Methode Matches(), die eine MatchCollection-Klasse zurückgibt. Es enthält alle übereinstimmenden Werte in der Reihenfolge, in der sie gefunden wurden. Werfen wir einen Blick darauf, wie es verwendet werden kann:

string testString = "123-456-789-0";
Regex regex = new Regex(@"([0-9]+)");
MatchCollection matchCollection = regex.Matches(testString);
foreach (Match match in matchCollection)
    Console.WriteLine("Number found at index " + match.Index + ": " + match.Value);

Ich habe die Regex und die Testzeichenfolge im Vergleich zu den vorherigen Beispielen geändert. Wir haben jetzt eine Testzeichenfolge, die mehrere Zahlen enthält, und eine Regex, die speziell nach Strings sucht, die aus einer oder mehreren Zahlen bestehen. Wir verwenden die Matches() -Methode, um eine "MatchCollection" aus unserer Regex zu erhalten, die die Übereinstimmungen in der Zeichenfolge enthält. In diesem Fall gibt es vier Übereinstimmungen, die wir nacheinander mit einer foreach -Schleife ausgeben. Das Ergebnis sieht ungefähr so aus:

Number found at index 0: 123
Number found at index 4: 456
Number found at index 8: 789
Number found at index 12: 0

Wenn keine Übereinstimmungen gefunden werden, wäre eine leere MatchCollection zurückgegeben worden.

Zusammenfassung

Mit Hilfe der Regex-Klasse können wir zusammen mit den "Match"- und "MatchCollection"-Klassen ganz einfach String-Matching durchführen. Die Regular Expression-Syntax mag sehr komplex erscheinen, aber sobald Sie sie gelernt haben, werden Sie ein sehr starkes Werkzeug haben. Auch wenn Sie keine Zeit in das Erlernen der Regex-Syntax investieren möchten, können Sie mit einer einfachen Google-Suche häufig Ausdrücke für bestimmte Bedürfnisse finden, die von anderen Programmierern erstellt wurden. Sobald Sie die Regex-Zeichenfolge geschrieben oder ausgeliehen haben, können Sie sie mit den in diesem Artikel beschriebenen Techniken und Klassen für Ihre eigenen Zwecke verwenden.

Aber das Suchen ist nur ein Teil des Spaßes - Sie können auch einige sehr coole Suchen/Ersetzen-Operationen mit Regulären Ausdrücken durchführen. Wir werden das in einem der nächsten Artikel untersuchen.


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!