Gebrauch von regulären Ausdrücken in .NET

(Auszug aus "Reguläre Ausdrücke" von Jeffrey E. F. Friedl)

Die regulären Ausdrücke in .NET sind mächtig, sauber aufgebaut und haben eine vollständige und einfach zu verwendende Benutzerschnittstelle. Microsoft hat bei der Implementation ganze Arbeit geleistet – aber bei der Dokumentation völlig versagt. Diese ist ganz entsetzlich: unvollständig, schlecht geschrieben, unsystematisch aufgebaut und manchmal einfach falsch. Ich habe mich in dem Paket erst nach einer Weile zurechtgefunden und hoffe, dass dieses Kapitel die regulären Ausdrücke in .NET für Sie etwas klarer werden lässt.

Ganz kurz: Reguläre Ausdrücke in .NET

Man kann das .NET-Regex-Paket ganz gut benutzen, ohne über die Einzelheiten des Regex-Klassenmodells genau Bescheid zu wissen. Die Details sind wichtig, wenn es um ganz spezifische Informationen und um Fragen der Effizienz geht, aber in den folgenden Abschnitten werden ganz einfache Beispiele vorgestellt, in denen keine Klassen explizit erzeugt werden. Dies sind nur Beispiele; die Einzelheiten folgen später.

Jedes Programm, das das Regex-Paket benutzt, muss es mit der Zeile

Imports System.Text.RegularExpressions

am Anfang der Datei einbinden (siehe Den Regex-Namensraum importieren). In den folgenden Beispielen wird diese Zeile vorausgesetzt.

Die Beispiele arbeiten alle mit der String-Variablen TestStr. Hier und in allen Beispielen in diesem Kapitel sind vom Benutzer wählbare Bezeichner kursiv gedruckt.

Ganz kurz: Passt die Regex?

Das folgende Beispiel überprüft, ob die Regex auf den Suchstring passt:

If Regex.IsMatch(TestStr, "^\s*$")
    Console.WriteLine("Zeile ist leer.")
Else
    Console.WriteLine("Zeile ist nicht leer.")
End If

Bei diesem Beispiel wird eine Matching-Option verwendet:

If Regex.IsMatch(TestStr, "^subject:", RegexOptions.IgnoreCase)
    Console.WriteLine("Die Zeile ist eine Betreffzeile.")
Else
    Console.WriteLine("Die Zeile ist keine Betreffzeile.")
End If

Ganz kurz: Mustersuche und Treffertext

In den folgenden Beispielen wird der von der Regex gefundene Text ausgewertet. Bei einem Fehlschlag wird der Treffertext DieZahl auf den leeren String gesetzt:

Dim DieZahl as String = Regex.Match(TestStr, "\d+").Value
If DieZahl <> ""
    Console.WriteLine("Die Zahl lautet: " & DieZahl)
End If

Dieses Beispiel benutzt eine Matching-Option:

Dim ImgTag as String = Regex.Match(TestStr, "<img\b[^>]*>", _
                                   RegexOptions.IgnoreCase).Value
If ImgTag <> ""
    Console.WriteLine("Image-Tag: " & ImgTag)
End If

Ganz kurz: Mustersuche mit eingefangenem Text

In diesem Beispiel wird der Text aus der ersten einfangenden Klammer (also $1) als String ausgegeben:

Dim Subject as String = _
    Regex.Match(TestStr, "^Subject: (.*)").Groups(1).Value
If Subject <> ""
    Console.WriteLine("Betreff: " & Subject)
End If

In C# müssen Sie statt Groups(1) die Notation Groups[1] mit eckigen Klammern benutzen.

Hier dasselbe Beispiel mit einer Option:

Dim Subject as String = _
    Regex.Match(TestStr, "^subject: (.*)", RegexOptions.IgnoreCase).Groups(1).Value
If Subject <> ""
    Console.WriteLine("Betreff: " & Subject)
End If

Und noch einmal dasselbe, diesmal mit benannten einfangenden Klammern:

Dim Subject as String = _
    Regex.Match(TestStr, "^subject: (?<Subj>.*)", _
                RegexOptions.IgnoreCase).Groups("Subj").Value
If Subject <> ""
    Console.WriteLine("Betreff: " & Subject)
End If

Ganz kurz: Suchen und Ersetzen

In diesem Beispiel werden HTML-Sonderzeichen in HTML-Entities verwandelt:

TestStr = Regex.Replace(TestStr, "&", "&amp;")
TestStr = Regex.Replace(TestStr, "<", "&lt;")
TestStr = Regex.Replace(TestStr, ">", "&gt;")
Console.WriteLine("Für HTML vorbereitet: " & TestStr)

Der Ersatztext (das dritte Argument) wird auf besondere Weise interpretiert, wie im Kasten Spezielle »Dollar-Sequenzen« im Ersatztext erklärt wird. Zum Beispiel wird im Ersatztext ›$&‹ durch den Treffertext ersetzt. Das folgende Beispiel packt Wörter, die mit Großbuchstaben beginnen, in <B>...</B> ein:

TestStr = Regex.Replace(TestStr, "\b[A-Z]\w*", "<B>$&</B>")
Console.WriteLine("Veränderter String: " & TestStr)

In diesem Beispiel wird die Sequenz <B>...</B> (ohne Rücksicht auf Groß- oder Kleinschreibung) durch <I>...</I> ersetzt:

TestStr = Regex.Replace(TestStr, "<b>(.*?)</b>", "<I>$1</I>", RegexOptions.IgnoreCase)
Console.WriteLine("Veränderter String: " & TestStr)
Tipp der data2type-Redaktion:
Zum Thema Reguläre Ausdrücke bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an:
   

Copyright der deutschen Ausgabe © 2008 by O’Reilly Verlag GmbH & Co. KG
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "Reguläre Ausdrücke" denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

O’Reilly Verlag GmbH & Co. KG, Balthasarstr. 81, 50670 Köln