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

Liste

.NET 2.0 (1)
.NET Allgemein (16)
.NET Fu (5)
ADO.NET (11)
Aprilscherz (3)
ASP Grundlagen (44)
ASP Tricks (83)
ASP.NET (44)
ASPIntranet.de (5)
C# (28)
Datenbank (44)
Dokumentation (4)
IIS 6.0 (1)
Komponenten (29)
Optimierung (10)
Server (21)
Sicherheit (34)
Tee Off (6)
VB.NET (6)
WAP (8)
Web Services (11)
XML (9)

RSS 2.0 - Die neuesten fünf Artikel auf AspHeute.com


 

Suchen





 

English Articles
Chinese Articles
Unsere Autoren
 
Link zu AspHeute
Impressum
Werben
Anfragen

Regex'en zu Assemblies kompilieren

Geschrieben von: Christoph Wille
Kategorie: .NET Allgemein

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.

Download des Codes

Klicken Sie hier, um den Download zu starten.

Verwandte Artikel

Das foreach Statement
Exception Handling in C#
Exception Handling in Visual Basic.NET
Mailadressen-überprüfen für Fortgeschrittene
Reguläre Ausdrücke / Regular Expressions
Sprachenintegration in .NET
Verhinderung von SQL Injection Marke .NET
Web Projekte mit SharpDevelop erstellen

Links zu anderen Sites

Regular Expression Library
SharpDevelop (#develop)

Wenn Sie jetzt Fragen haben...

Wenn Sie Fragen rund um die in diesem Artikel vorgestellte Technologie haben, dann schauen Sie einfach bei uns in den Community Foren der deutschen .NET Community vorbei. Die Teilnehmer helfen Ihnen gerne, wenn Sie sich zur im Artikel vorgestellten Technologie weiterbilden möchten.

Eine weitere sehr hilfreiche Resource ist das deutsche ASP.NET Wiki, das als zentrale Anlaufstelle für Tips, Tricks, Know How und alles Nützliche was man in seinem Alltag als (ASP).NET-Entwickler so braucht und entdeckt gedacht ist.

Haben Sie Fragen die sich direkt auf den Inhalt des Artikels beziehen, dann schreiben Sie dem Autor! Unsere Autoren freuen sich über Feedback zu ihren Artikeln. Ein einfacher Klick auf die Autor kontaktieren Schaltfläche (weiter unten) und schon haben Sie ein für diesen Artikel personalisiertes Anfrageformular.

 

Und zu guter Letzt möchten wir Sie bitten, den Artikel zu bewerten. Damit helfen Sie uns, die Qualität der Artikel zu verbessern - und anderen Lesern bei der Auswahl der Artikel, die sie lesen sollten.

Bewerten Sie diesen Artikel
 Sehr gut   Nicht genügend  
   1  2  3  4  5  
 

  
   Für Ausdruck optimierte Seite

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