Regex'en zu Assemblies kompilieren
Geschrieben von: Christoph Wille 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 kompilierenDer 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 einsetzenUm 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ßbemerkungMit 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 CodesKlicken Sie hier, um den Download zu starten. Verwandte Artikel
Das foreach Statement Links zu anderen Sites
Regular Expression Library 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.
©2000-2006 AspHeute.com |