Statische »Komfort-Funktionen«

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

Schon in den »Ganz kurz«-Abschnitten hatten wir gesehen, dass man nicht immer explizite Regex-Objekte erzeugen muss. Mit den folgenden statischen Funktionen kann man reguläre Ausdrücke direkter anwenden:

Regex.IsMatch(Suchtext, Muster)
Regex.IsMatch(Suchtext, Muster, Optionen)

Regex.Match(Suchtext, Muster)
Regex.Match(Suchtext, Muster, Optionen)

Regex.Matches(Suchtext, Muster)
Regex.Matches(Suchtext, Muster, Optionen)

Regex.Replace(Suchtext, Muster, Ersatztext)
Regex.Replace(Suchtext, Muster, Ersatztext, Optionen)

Regex.Split(Suchtext, Muster)
Regex.Split(Suchtext, Muster, Optionen)

Intern rufen diese Funktionen natürlich die bisher benutzten Regex-Konstruktoren und -Methoden auf, erzeugen ein temporäres Regex-Objekt, wenden die verlangte Methode darauf an und löschen das Objekt nach Gebrauch wieder. (Nun, in Wirklichkeit werden die benutzten Objekte nicht weggeworfen – mehr dazu später.)

Hier sehen Sie ein Beispiel:

If Regex.IsMatch(Zeile, "^\s*$")
   ...

Das bewirkt das Gleiche wie

Dim TempRegex = New Regex("^\s*$")
If TempRegex.IsMatch(Zeile)
   ...

oder, noch genauer, das Gleiche wie:

If New Regex("^\s*$").IsMatch(Zeile)
   ...

Mit diesen Komfort-Funktionen sind einfache Aufgaben viel einfacher zu erledigen. Mit diesen Funktionen wird dem an sich objektorientierten Regex-Paket eine prozedurale Schnittstelle hinzugefügt (siehe Prozeduraler und objektorientierter Ansatz). Der Nachteil ist, dass die Regex jedes Mal neu evaluiert und übersetzt werden muss.

Wenn eine Regex im ganzen Programm nur einmal benutzt wird, spielt das in Bezug auf die Effizienz keine Rolle. Wenn aber eine Regex mehrfach (in einer Schleife oder in einer häufig benutzten Funktion) verwendet wird, kann sich der zusätzliche Aufwand für das Vorbereiten der Regex schon auswirken (siehe Umsonst gibt’s nichts!). Genau darum baut man ja im objektorientierten Ansatz das Regex-Objekt nur einmal auf und benutzt es nachher wiederholt. Im .NET-Paket sind aber die Vorteile beider Ansätze vereint: einfache Anwendung des prozeduralen Ansatzes ohne Effizienzverlust.

Caching von regulären Ausdrücken

Es ist natürlich ziemlich umständlich, für jede kleine Regex eigens ein separates Regex-Objekt erzeugen zu müssen. Deshalb ist es enorm praktisch, dass die statischen Komfort-Methoden in .NET intern ein temporäres Regex-Objekt verwenden. Die Kehrseite der Medaille ist natürlich, dass dieses temporäre Objekt bei jedem Aufruf erzeugt, verwendet und weggeworfen wird; wenn dies in einer Schleife passiert, ist das sehr ineffizient.

Dies wird in .NET durch die Verwendung eines Cache von regulären Ausdrücken vermieden. Caching wird unter Die Kunst, reguläre Ausdrücke zu schreiben genauer behandelt (siehe Kompilations-Caching beim prozeduralen Ansatz), kurz gesagt geht es um Folgendes: Wenn ein regulärer Ausdruck verwendet wird, der mit den gleichen Optionen »schon einmal« angewandt wurde, dann wird das im Cache gespeicherte interne Regex-Objekt wiederverwendet.

»Schon einmal« bedeutet bei .NET in der Voreinstellung, dass die Regex mit einer der 15 zuletzt gebrauchten übereinstimmen muss. Wenn in einer Schleife mehr als 15 verwendet werden, fällt bei der 16. Regex die erste aus dem Cache und muss bei erneutem Gebrauch von Grund auf neu erzeugt werden.

Wenn die voreingestellte Cache-Größe von 15 nicht ausreicht, kann sie vom Benutzer erweitert werden:

Regex.CacheSize = 123

Wenn man das Caching ganz ausschalten will, kann man die Cache-Größe auf 0 setzen.

  

<< 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