Regex-Assemblies

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

In .NET kann man Regex-Objekte in Assemblies verpacken und so Bibliotheken von regulären Ausdrücken in der Form von DLLs abspeichern. Das Beispiel im folgenden Kasten zeigt, wie das geht.


Eigene Regex-Bibliotheken mit Assemblies erzeugen

Dieses Beispielprogramm erzeugt eine kleine Regex-Bibliothek (eine Assembly oder DLL), die drei vorgefertigte Regex-Konstruktoren namens jfriedl.Mail.Subject, jfriedl.Mail.From und jfriedl.CSV.GetField enthält.

Die ersten zwei sind ganz einfache Beispiele, die lediglich den grundsätzlichen Ablauf illustrieren; das dritte ist immerhin so komplex, dass sich die Unterbringung in einer eigenen Bibliothek tatsächlich lohnt. Beachten Sie, dass die Option RegexOptions.Compiled nicht angegeben wird, diese wird beim Erzeugen einer Assembly impliziert. Wie man die Bibliothek verwendet, steht im Haupttext (siehe unten).

Option Explicit On
Option Strict On

Imports System.Text.RegularExpressions
Imports System.Reflection

Module BibliothekErzeugen
Sub Main()
 'Argumente bei den Aufrufen von RegexCompilationInfo: Regex, Optionen, Name innerhalb
 'der Klasse, Name der Klasse und ein boolescher Wert, der besagt, ob die Klasse »public« ist.
 'Programme benutzen die erste Klasse mit »jfriedl.Mail.Subject«, einem Konstruktor.
 Dim RCInfo() as RegexCompilationInfo = {                                           _
New RegexCompilationInfo(                                                        _
  "^Subject:\s*(.*)", RegexOptions.IgnoreCase, "Subject", "jfriedl.Mail", true), _
New RegexCompilationInfo(                                                        _
  "^From:\s*(.*)", RegexOptions.IgnoreCase, "From", "jfriedl.Mail", true),       _
New RegexCompilationInfo(                                                        _
  "\G(?:^|,)                                                             " &     _
  "(?:                                                                   " &     _
  "    (?# Entweder ein Feld in Anführungszeichen ... )                  " &     _
  "    ""  (?# Öffnendes Anführungszeichen )                             " &     _
  "     (?<QuotedField>  (?> [^""]+ | """" )*   )                        " &     _
  "    ""  (?# Schließendes Anführungszeichen )                          " &     _
  "  (?# ... oder ... )                                                  " &     _
  "  |                                                                   " &     _
  "    (?# ... ein ’nacktes’ Feld ohne Kommas und Anführungszeichen. )   " &     _
  "    (?<UnquotedField> [^"",]* )                                       " &     _
  ")",                                                                           _
  RegexOptions.IgnorePatternWhitespace, "GetField", "jfriedl.CSV", true)         _
 }
 'Jetzt nehmen wir den ganzen Brocken und schreiben die Bibliothek auf Festplatte ...
 Dim AN as AssemblyName = new AssemblyName()
 AN.Name = "JfriedlsRegexLibrary"      'Dateiname der DLL.
 AN.Version = New Version("1.0.0.0")
 Regex.CompileToAssembly(RCInfo, AN)   'Bibliothek und DLL erzeugen.
End Sub
End Module

Wenn das Programm aus dem Kasten ausgeführt wird, erzeugt es eine Assembly und speichert diese in der Bibliothek JfriedlsRegexLibrary.DLL im bin-Verzeichnis des Projekts.

Diese Assembly kann dann in anderen Projekten verwendet werden, wenn sie in Visual Studio mit der Menü-Option Project > Add Reference in das aktuelle Projekt eingebunden wird.

Die Klassen aus der Assembly müssen zuerst importiert werden:

Imports jfriedl

Danach können sie wie jede andere Klasse verwendet werden, wie im folgenden Beispiel:

Dim FeldRegex as CSV.GetField = New CSV.GetField 'Neues Regex-Objekt erzeugen.
   ...
Dim FeldMatch as Match = FeldRegex.Match(Zeile) 'Regex auf einen String anwenden.
While FeldMatch.Success
  Dim Feld as String
  If FeldMatch.Groups(1).Success
    Feld = FeldMatch.Groups("QuotedField").Value
    Feld = Regex.Replace(Feld, """""", """") 'Verdoppelte Anführungszeichen -> einfache.
  Else
    Feld = FeldMatch.Groups("UnquotedField").Value
  End If
Console.WriteLine("[" & Feld & "]")
  ' Wert in Feld kann jetzt weiterverarbeitet werden.
  FeldMatch = FeldMatch.NextMatch
End While

In diesem Beispiel habe ich nur den Namensraum jfriedl importiert, ich hätte ebenso gut den Namensraum jfriedl.CSV bei der Imports-Anweisung angeben können. Das Regex-Objekt wäre dann wie folgt erzeugt worden:

Dim FeldRegex as GetField = New GetField 'Regex-Objekt erzeugen.

Der Unterschied ist vor allem stilistischer Natur. Sie müssen gar nichts importieren, Sie können jede Klasse auch voll qualifiziert angeben:

Dim FeldRegex as jfriedl.CSV.GetField = New jfriedl.CSV.GetField

Das ist ein bisschen schwerfällig, sagt aber genau aus, woher das Objekt kommt. Auch das ist eine Stilfrage.

  

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