Glengamoi (Forum) · AspHeute · .NET Heute (RSS-Suche) · AspxFiles (Wiki) · .NET Blogs

Regex'en zu Assemblies kompilieren

Geschrieben von: Christoph Wille
Kategorie: .NET Allgemein

This printed page brought to you by AlphaSierraPapa

Mit .NET kann man reguläre Ausdrücke (Regex) in eine Assembly vorkompilieren, was einen Geschwindigkeitsvorteil zur Ausführungszeit mit sich bringt. Heute werden wir uns die notwendigen Schritte dafür anhand eines sehr praktischen Szenarios ansehen - wir werden eine Emailvalidierungs-Regex vorkompilieren, die man dann in allen Programmiersprachen und quer über Windows Forms oder ASP.NET Web Forms einsetzen kann.

Regex'en kompilieren

Der erste Schritt ist, sich einen regulären Ausdruck für die Emailvalidierung zu schreiben. Da ich für solche Denksportaufgaben keine Zeit aufwenden möchte, wende ich die Copy/Paste Programmiermethode an - gewußt wo suchen, und dann übernehmen. In diesem Fall habe ich die Emailvalidierungs-Regex'en von der Regular Expression Library übernommen.

Unser Code für die Kompilierung einer Regex sieht so aus ( #develop Projekt CompileRegEx):

using System;
using System.IO;

using System.Reflection;
using System.Text.RegularExpressions;

class MainClass
{
  public static void Main(string[] args)
  {
    // http://regexlib.com/REDetails.aspx?regexp_id=26
    string strRegex = @"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\. ...
    
    // http://regexlib.com/REDetails.aspx?regexp_id=72
    // string strRegex = @"^(([^<>;()[\]\\.,;:@""]+(\.[^<>()  ...
                                                                                            
    // zwar unnotwendig, aber man sollte checken, ob die RegEx überhaupt 
    // funktioniert bevor man kompiliert
    try
    {
      Regex re = new Regex(strRegex);
    }
    catch (ArgumentException ae)
    {
      Console.WriteLine("Regex creation error, reason: " + ae.Message);
      return;
    }
    
    RegexCompilationInfo  rci = new RegexCompilationInfo(strRegex,
      RegexOptions.Compiled, 
      "EmailValidationRegEx",  // Class name
      "DotNetHeute",           // Namespace
      true);                   // is public
    
    AssemblyName asmName = new AssemblyName();
    asmName.Name = "emailregex";

    RegexCompilationInfo[] rciArray = new RegexCompilationInfo[] { rci };
    
    try
    {
      Regex.CompileToAssembly(rciArray, asmName);
    }
    catch (ArgumentException ae)
    {
      Console.WriteLine("Error in compilation: " + ae.Message);
      return;
    }
    
    Console.WriteLine("emailregex.dll erfolgreich erzeugt");
  }
}

Zuerst wird geprüft, ob die Regex überhaupt korrekt ist (vorausgedacht für den Fall, daß man später Kommandozeilenparameter für diese Applikation einführt). Danach wird ein RegexCompilationInfo Objekt erzeugt:

    RegexCompilationInfo  rci = new RegexCompilationInfo(strRegex,
      RegexOptions.Compiled, 
      "EmailValidationRegEx",
      "DotNetHeute",
      true);

Der erste Parameter ist die Regex selbst, gefolgt von der Anweisung, daß wir sie kompilieren wollen. Danach kommt der Klassenname unter dem wir das Objekt später aufrufen wollen, sowie dessen Namespacezugehörigkeit. Der letzte Parameter gibt an, ob die Klasse public sein soll (ja, weil sonst können wir sie nicht verwenden).

Weiters müssen wir der Klasse eine Assembly zuteil werden lassen:

    AssemblyName asmName = new AssemblyName();
    asmName.Name = "emailregex";

Die Zeile

    RegexCompilationInfo[] rciArray = new RegexCompilationInfo[] { rci };

gibt den Hinweis, daß wir mehr als eine Regex pro Assembly kompilieren könnten. Hier erstellen wir allerdings eine Assembly mit nur einer Regex.

    Regex.CompileToAssembly(rciArray, asmName);

Mit diesem Befehl wird die Regex-Assembly emailregex.dll erstellt. Diese kann nun sofort in einer Applikation - Web oder Windows - eingesetzt werden.

Die kompilierte Regex einsetzen

Um die Verwendung zu verdeutlichen, habe ich eine Kommandozeilenapplikation geschrieben, die einige Emailadressen auf Plausibilität prüft - und zwar mit Hilfe unserer vorkompilierten Regex ( #develop Projekt TestRegEx):

using System;
using DotNetHeute;

using System.Collections.Specialized;
using System.Text.RegularExpressions;

class MainClass
{
  public static void Main(string[] args)
  {
    EmailValidationRegEx re = new EmailValidationRegEx();
    
    StringCollection email2Validate = new StringCollection();
    email2Validate.Add("christophw@alphasierrapapa.com");
    email2Validate.Add("christophw@192.168.1.100");
    email2Validate.Add("christophw@com");
    email2Validate.Add("christophw@com.info");
    
    foreach(string strAddress2Validate in email2Validate) 
    {
      if (re.IsMatch(strAddress2Validate)) 
      {
        Console.WriteLine(strAddress2Validate + " *OK*");
      }
      else
      {
        Console.WriteLine(strAddress2Validate + " no email address");
      }
    }
    
  }
}

Der Namespace DotNetHeute wird referenziert, und danach kann die EmailValidationRegEx Klasse eingesetzt werden. Die Assembly wird in der IDE referenziert:

Mittels IsMatch wird gecheckt, ob eine Adresse entspricht. Wenig überraschend hier der Output:

christophw@alphasierrapapa.com *OK*
christophw@192.168.1.100 *OK*
christophw@com no email address
christophw@com.info *OK*

Natürlich kann die Regex-Klasse auch in ASP.NET zum Einsatz kommen, nur muß man entsprechend die Assembly ins bin Verzeichnis kopieren und auf den Seiten registrieren.

Schlußbemerkung

Mit kompilierten Regex'en erspart man sich, die Regex an allen Orten definieren zu müssen, und bekommt noch dazu eine bessere Performance. Für oft wiederverwendete Regex'en sicherlich die bevorzugte Art der Verwendung.

This printed page brought to you by AlphaSierraPapa

Download des Codes

Klicken Sie hier, um den Download zu starten.
http://www.aspheute.com/code/20020902.zip

Verwandte Artikel

Das foreach Statement
http:/www.aspheute.com/artikel/20000720.htm
Exception Handling in C#
http:/www.aspheute.com/artikel/20000724.htm
Exception Handling in Visual Basic.NET
http:/www.aspheute.com/artikel/20001024.htm
Mailadressen-überprüfen für Fortgeschrittene
http:/www.aspheute.com/artikel/20000822.htm
Reguläre Ausdrücke / Regular Expressions
http:/www.aspheute.com/artikel/20000829.htm
Sprachenintegration in .NET
http:/www.aspheute.com/artikel/20011010.htm
Verhinderung von SQL Injection Marke .NET
http:/www.aspheute.com/artikel/20011203.htm
Web Projekte mit SharpDevelop erstellen
http:/www.aspheute.com/artikel/20010208.htm

Links zu anderen Sites

Regular Expression Library
http://regexlib.com/
SharpDevelop (#develop)
http://www.icsharpcode.net/opensource/sd/

 

©2000-2006 AspHeute.com
Alle Rechte vorbehalten. Der Inhalt dieser Seiten ist urheberrechtlich geschützt.
Eine Übernahme von Texten (auch nur auszugsweise) oder Graphiken bedarf unserer schriftlichen Zustimmung.