Im Gegensatz zur Suche in Textverarbeitungsprogrammen kann innerhalb von RegEx auch ein positives Ergebnis der Länge Null, also ein Leerstring ausgegeben werden. Dies kann auf zwei verschiedene Arten erzeugt werden. Zum einen gibt es Assertionen / Überprüfungen der Länge Null, die bsp. die Wortgrenzen prüfen. Zum anderen können Quantifikatoren so eingesetzt werden, daß sie null oder mehrere Ergebnisse als Erfolg interpretieren und/oder sich mit möglichst wenig zufriedengeben. In solchen Fällen kann ein Suchmuster, angewandt auf eine Zeichenfolge mit n Zeichen, n Ergebnisse der Länge Null zurückliefern. Im RegEx-Trainer erscheint jedes Ergebnis als neue Zeile, in diesem Fall sind die Zellen leer.
Falls mit C# programmiert wird, so dient der Backslash '\' innerhalb von Texten zur Kennzeichnung von Sonderzeichen. Enthält das Suchmuster in der hiesigen Darstellung einen Backslash, so muß es innerhalb von C# mit verdoppeltem Backslash als '\\' verwendet werden. Wird der Backslash innerhalb von RegEx maskiert, so benötigt C# eine Vierfachmaskierung '\\\\'. Alternativ können in C# Literalzeichenfolgen durch ein vorangestelltes '@' definiert werden, dann entfällt die C#-typische Maskierung (bsp. @"\b", wenn im hiesigen Tutorial "\b" notiert wird). Dies gilt ebenfalls für C++ und JScript, dort gibt es allerdings kein '@'.
Eine typische Verwendung mit VB.NET kann so aussehen:
'Deklaration eines RegEx-Objektes
Dim _rE As New RegEx("und")
'Deklaration eines Objektes für das Ergebnis
Dim _m As Match
'Anwendung auf die Zeichenfolge
_m = _rE.Match("RegEx lernen und nutzen")
'Ausgabe in die Konsole
If _m.Success Then
Console.WriteLine("Ergebnis: " & _m.Value)
Else
Console.WriteLine("Nichts gefunden")
End If
Dies liefert die Ausgabe:
Ergebnis: undAuf den folgenden Seiten wird ein solches Ergebnis in der Form RegEx lernen und nutzen dargestellt.
Dim _rE As New RegEx("reg", RegexOption.IgnoreCase)
findet RegEx regeneriert mit
irregulärer Regelhaftigkeit.
Dieselbe Option läßt sich inline, innerhalb des Suchmusters festlegen, dies erledigt der Ausdruck
(?i:reg).Diese direkte Einsetzung entspricht dem einfachen Suchen in Textverarbeitungsprogrammen. Sie gilt für alle Zeichen mit Ausnahme der folgenden Elemente:
$ ^ { [ ( | ) * + ? \
Jedes dieser Zeichen gewinnt in einem passenden Kontext eine besondere Bedeutung. Soll ein solches Zeichen direkt, ohne Sonderbedeutung,
erkannt werden, so wird es mit '\' maskiert. \? sucht nach dem Fragezeichen, \\ sucht nach dem Backslash. Ferner gibt es
Sonderzeichen wie Tabulatur (	) oder einer neuen Zeile (&#A;), für die Escapezeichen (\t bzw. \n)
definiert sind. Auf den ersten Blick hiervon nicht unterscheidbar werden auch gewisse Zeichenklassen (\w für Wortzeichen),
atomare Assertionen der Breite Null (\b für eine Wortgrenze) und
Rückverweisungskonstrukte (\k) in der Form '\Buchstabe'
notiert. Diese Vieldeutigkeit des Ausdrucks '\Buchstabe' kann bei der Erarbeitung von RegEx durchaus zur Verwirrung führen, da gleichartig
erscheinende Kürzel zu verschiedenen Typen gehören.
Ein spezielles Sonderzeichen stellt der Punkt (.) dar. Dieser erfaßt alle Zeichen mit Ausnahme des Zeilenwechsels \n bzw. #xA. Eine quantifizierte Suche mit .+ gibt jede Zeile der Eingabezeichenfolge als eine Fundstelle aus. Die Zahl der Fundstellen ist gleich der Zahl der Zeilen. Dieses Verhalten kann durch die Single-Line-Option (i) modifiziert werden. Diese durchaus mißverständlich interpretierbare Option ändert ausschließlich das Verhalten des Punktes, nun wird auch \n gefunden. Es wird kein Zeichen verändert oder ignoriert, auch wird die Eingabezeichenfolge nicht in einzelne 'single lines' aufgeteilt. Stattdessen wird die gesamte Eingabe als 'eine Zeile' im Sinne von 'einer Einheit' betrachtet. Die Inline-Verwendung der Option mit (?i:.+) findet die gesamte Eingabezeichenfolge als eine einzige Fundstelle.
Benutzerdefinierte Zeichenklassen werden mittels eckiger Klammern ([]) definiert. Die gewünschten Elemente werden aufgezählt. [aeiou] sucht nach einem der fünf Vokale und findet Alle Vokale. Innerhalb eckiger Klammern verlieren alle Sonderzeichen mit Ausnahme von \ und ^ ihre spezielle Bedeutung. \ kann weiterhin dazu benutzt werden, um vordefinierte Zeichenklassen zur durch die Eckklammern deklarierten Zeichenklasse hinzuzufügen. So findet [\p{Sm}\p{Sc}] alle Zeichen der beiden Unicode-Kategorien 'Symbol, Math' sowie 'Symbol, Currency'. Wird als erstes Zeichen innerhalb der eckigen Klammern ein '^' notiert, so definiert dies das Komplement der in den eckigen Klammern stehenden Zeichenmenge. Es werden also alle Zeichen gefunden, die nicht zu dieser Menge gehören. [^aeiou] sucht alle Zeichen, die keine Vokale sind und findet Alle Vokale. Ab der zweiten Position verliert ^ seine Sonderbedeutung und findet sich selbst. Für alle anderen Zeichen ist die Reihenfolge innerhalb der eckigen Klammern irrelevant. Mit einer Zeichenklasse kann deshalb keine spezielle, aus mehreren Zeichen bestehende Zeichenfolge gefunden werden, bei welcher die Reihenfolge der Zeichen zu beachten ist.
Eleganter und besser selbstdokumentierend ist eine Lösung mit benannten Teilzeichenfolgen: (?<day>\d\d)\.(?<month>\d\d)\.(?<year>\d\d\d\d). Die in den Spitzklammern definierten Gruppennamen können anschließend direkt verwendet werden, etwa im Rahmen einer Ersetzung: ${month}/${day}/${year} erzeugt 06/21/2050 als Output. Der RegEx-Trainer gibt diese Gruppennamen als Spaltenüberschriften aus. Anstelle der Spitzklammern können auch einfache Hochkommata genutzt werden.
Auf eine im Suchmuster bereits definierte Gruppe kann später durch ein Rückverweis-Konstrukt Bezug genommen werden. Dies gelingt entweder mit der Nummer der Gruppe oder über den Gruppennamen. So kann man zunächst mit (\b\w+\b) ein Wort suchen und findet mit \b(?<doppelt>\w+)\b\s+\k<doppelt> das doppelte das in Wieder ist das das Wetter wechselhaft. Dasselbe gelingt, indem die Nummer der Gruppe in Spitzklammern gesetzt wird, so daß \b(\w+)\b\s+\k<1> dasselbe leistet. Zu beachten ist allerdings, daß atomare Assertionen der Breite Null nicht aufgezeichnet werden. Die Verwendung von \b(?<doppelt>\w+)\b\s+\k<doppelt> findet deshalb auch dies ist unglaublich und undenkbar. Erst der Gebrauch von \b(?<doppelt>\w+)\b\s+\b\k<doppelt>\b schließt solche Fälle aus.
Werden Klammern benötigt, um bsp. Ausdrücke zusammenzufassen und diese zu quantifizieren, ohne daß die Teilzeichenfolge später weiterverarbeitet wird, kann die Aufzeichnung durch die Verwendung einer nichtaufzeichnenden Gruppe verhindert werden: Dies erledigt der Ausdruck (?: ), die Klammern werden um '?:' ergänzt. Alternativ kann die Option ExplicitCapture (n) genutzt werden. Diese Option erzwingt, daß jede aufzuzeichnende Teilzeichenfolge explizit benannt sein muß. Alle Ausdrücke ( ) ohne Namen werden wie (?: ) interpretiert.