Regex-Objekte erzeugen

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

Der Konstruktor für Regex-Objekte ist sehr einfach. Das erste Argument ist die Regex in Stringdarstellung, und im zweiten, optionalen Argument können Optionen angegeben werden. Hier sehen Sie ein Beispiel mit nur einem Argument:

Dim StripTrailWS = new Regex("\s+$") ' Whitespace am Ende entfernen.

Damit wird lediglich ein Regex-Objekt erzeugt und für die Anwendung vorbereitet, aber es wird noch keine Mustersuche ausgelöst.

Ein Beispiel mit zwei Argumenten sieht wie folgt aus:

Dim GetSubject = new Regex("^subject: (.*)", RegexOptions.IgnoreCase)

Mit OR können mehrere Optionen verwendet werden:

Dim GetSubject = new Regex("^subject: (.*)", _
                           RegexOptions.IgnoreCase OR RegexOptions.Multiline)

Ausnahmen abfangen

Wenn die Regex syntaktisch nicht korrekt ist, wird die Ausnahme ArgumentException ausgelöst. Normalerweise fängt man diese nicht ab, wenn man eine Regex selbst entwickelt hat und sie fest im Programm eingebaut ist. Wenn man aber eine Regex »von außen« erhält (aus einer Konfigurationsdatei oder von einer Benutzereingabe), dann ist es sehr wichtig, diese zu prüfen. Ein Beispiel:

Dim R As Regex
Try
    R = New Regex(BenutzerEingabe)
Catch e As ArgumentException
    Console.WriteLine("*ERROR* Fehler in der Regex: " & e.ToString)
    Exit Sub
End Try

Je nach Situation wird man natürlich nicht nur die Fehlermeldung ausgeben.

Regex-Optionen

Beim Konstruktor für das Regex-Objekt sind folgende Optionen möglich:

RegexOptions.IgnoreCase

Mit dieser Option werden Groß- und Kleinbuchstaben im Suchstring nicht unterschieden (siehe Der Modus »Groß- und Kleinschreibung ignorieren«).

RegexOptions.IgnorePatternWhitespace

Mit der Option wird die Regex im Modus »Freie Form« geparst (siehe Der Modus »Freie Form«). Außerdem sind Kommentare zulässig; wenn Sie die »nackte« Form der Kommentare mit ˹#...˼ benutzen, muss am Ende des Kommentars ein Newline folgen, sonst wird der ganze Rest der Regex auskommentiert.

In VB.NET muss dies mit chr(10) erfolgen, wie in diesem Beispiel:

Dim R as Regex = New Regex( _
    "# Eine Fließkommazahl ...                     " & chr(10) & _
    "  \d+(?:\.\d*)? # Ziffern am Anfang ...       " & chr(10) & _
    "  |             # ... oder ...                " & chr(10) & _
    "  \.\d+         # ... nur ein Dezimalpunkt    ", _
    RegexOptions.IgnorePatternWhitespace)

Das ist schon sehr mühsam; in VB.NET sind die Kommentare mit der geklammerten Form ˹(?#...)˼ viel praktischer:

Dim R as Regex = New Regex( _
    "(?# Eine Fließkommazahl ...                      )" & _
    "  \d+(?:\.\d*)? (?# Ziffern am Anfang ...        )" & _
    "  |             (?# ... oder ...                 )" & _
    "  \.\d+         (?# ... nur ein Dezimalpunkt     )", _
    RegexOptions.IgnorePatternWhitespace)

RegexOptions.Multiline

Die Regex wird im Modus »verbesserte Zeilenanker« oder im Mehrzeilenmodus angewandt (siehe Der Modus »Verbesserte Zeilenanker« oder Mehrzeilenmodus). Die Metazeichen ˹^˼ und ˹$˼ passen auch bei Newlines mitten im String und nicht nur am Stringanfang oder -ende.

RegexOptions.Singleline

Mit dieser Option verändert sich das Verhalten von ›.‹, der Punkt passt jetzt wirklich auf jedes Zeichen (siehe Der Modus »Punkt passt auf alles«); normalerweise ist das Newline davon ausgenommen.

RegexOptions.ExplicitCapture

Mit dieser Option werden die normalen Klammern ˹(...)˼, die normalerweise Text einfangen, zu nicht-einfangenden Klammern. Sie verhalten sich also wie ˹(?:...)˼ und gruppieren nur. Mit benannten Klammerausdrücken ˹(?<Name>...)˼ kann man nach wie vor Textstücke einfangen.

Wenn Sie ohnehin die benannten Klammern verwenden und daneben auch Klammern benutzen, die gar keinen Text einfangen sollen, dann wird die Regex mit dieser Option viel lesbarer.

RegexOptions.RightToLeft

Mit dieser Option wird der »Von rechts nach links«-Modus aktiviert (siehe Mustersuche von rechts nach links).

RegexOptions.Compiled

Diese Option besagt, dass die Regex in ein optimierteres Format kompiliert werden soll, mit dem die Mustersuche normalerweise viel schneller wird. Dafür dauert die Kompilierung bei der ersten Anwendung viel länger, und das Programm belegt während der ganzen Programmlaufzeit mehr Speicher.

Wenn eine Regex nur einmal oder selten verwendet wird, ist RegexOptions.Compiled nicht sehr sinnvoll, weil der zusätzlich benötigte Speicher nicht freigegeben wird, wie das bei einem normalen Regex-Objekt nach dessen Gebrauch geschähe. Wenn die Regex an einer zeitkritischen Stelle viele Male gebraucht wird, zahlt sich die Option meist aus.

Ein Beispiel für den Gebrauch dieser Option finden Sie bei Benchmarks mit VB.NET. Dort wird mit dieser Option die Laufzeit halbiert. Beachten Sie auch die Möglichkeit, eine Regex in eine Assembly zu kompilieren (siehe Regex-Assemblies).

RegexOptions.ECMAScript

Mit dieser Option wird die Regex wie in ECMAScript geparst (siehe ECMAScript-Modus). Wenn Sie ECMAScript nicht kennen und nicht damit kompatibel sein müssen, können Sie diese Option getrost ignorieren.

RegexOptions.None

Diese »Nicht-Option« dient nur dazu, eine Variable vom Typ RegexOptions zu initialisieren. Später im Programm werden möglicherweise weitere Optionen mit OR hinzugefügt.

  

<< zurück vor >>

 

 

 

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