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

Reguläre Ausdrücke / Regular Expressions

Geschrieben von: Christian Koller
Kategorie: ASP Tricks

Der Begriff "regulärer Ausdruck" ist Ihnen vielleicht schon einmal untergekommen. Reguläre Ausdrücke benutzt man um festzustellen, ob eine Zeichenkette einer bestimmten Form genügt, oder ob eine "passende" Zeichenkette in einer anderen Zeichenkette enthalten ist. Ob man nun prüfen will, ob eine Zeichenkette ihrer Form nach wirklich eine Email Adresse sein kann, oder ob man bestimmte Zeichenfolgen in einer langen Zeichenkette suchen oder gar ersetzen will - Reguläre Ausdrücke sind ein effizienter und intelligenter Weg um in einem ASP Skript diese Zeichenkettenoperationen durchführen zu lassen.

Wie setzt man nun "Reguläre Asudrücke" in VBScript (und ASP) ein?

Um Reguläre Ausdrücke in ASP Seiten überhaupt einsetzen zu können benötigen Sie am Webserver (IIS 4.0 oder IIS 5.0) die Version 5.0 (oder höher) der Scripting Engine.

Die Version der Scripting Engine, die am Webserver installiert ist, können Sie mit folgendem ASP Skript überprüfen:

<%
Function GetScriptEngine()
   Dim strSE
   strSE = ScriptEngine & " " 
   strSE = strSE & ScriptEngineMajorVersion & "."
   strSE = strSE & ScriptEngineMinorVersion & "."
   strSE = strSE & ScriptEngineBuildVersion
   GetScriptEngine = strSE
End Function

Response.Write GetScriptEngine()
%>

Um dieses Script auf unserem Webserver auszuführen klicken Sie auf VBScript Version testen.

Die neueste Version der VBscript.dll können Sie bei Microsoft downloaden - die Links dazu finden Sie am Ende des Artikels.

Einsatz von regulären Ausdrücken in VBScript 5

Unter VBScript 5 geht man wie folgt vor, um mit Hilfe von regulären Ausdrücke spezifische Textstellen in einer Zeichenkette zu finden:

  • Generieren des RegExp (Regular Expression) Objektes
  • Pattern-Zuweisung (engl. Modell, Muster) zum RegExp Objekt. Dieser Schritt definiert das "Wortmuster" nach dem in einer Zeichenkette gesucht werden kann.
  • Setzen von Parametern wie "Großschreibung beachten" ...
  • Eine Zeichenkette nach dem definierten "Wortmuster" (Pattern) durchsuchen.
  • Optional: Auswertung der passenden Textstellen in der Zeichenkette. Feststellen der Position der Fundstelle und des Textes, der dem Wortmuster entspricht.

Ein einfaches ASP Skript, das diese Schritte ausführt, sieht zum Beispiel wie folgt aus:

<%
TestEmail "webmaster@aspheute.de"
TestEmail "a@b.c"
TestEmail "master@the.universe"

Function TestEmail(strEmail)
  ' ### Generieren des RegExp Objectes
  Set objRegAusdr = New RegExp
  ' ### Pattern-Zuweisung zum Testen
  ' ### auf Email der Form Name@Domain.com
  strPattern = "^.+@.+\...+$"
  objRegAusdr.Pattern = strPattern
  ' ### Setzen: Gross/Kleinschreibung nicht beachten
  objRegAusdr.IgnoreCase = True

  ' ### Zeichenkette strEmail nach Pattern durchsuchen
  Set Matches = objRegAusdr.Execute(strEmail)	

  If Matches.Count = 1 Then
    ' ### Ein Treffer 
    ' ### (Count der Matches Collection ist 1)
    ' ### Muster in Pattern passt genau zu 
    ' ### Inhalt von strTest:
    Response.Write(strEmail & " = Email Adresse!")
  Else
    ' ### Muster in Pattern passt nicht 
    ' ### zu Inhalt von strTest 
    Response.Write (strEmail & " = Keine Email Adresse!")
  End If
  Response.Write("<br>" & vbcrlf)
End Function
%>

Das Ergebnis dieses Scripts ist wie folgt:

webmaster@aspheute.de = Email Adresse!
a@b.c = Keine Email Adresse!
master@the.universe = Email Adresse!

Das RegExp Objekt ist sozusagen das Werkzeug, mit dessen Hilfe man eine Zeichenkette auf die Übereinstimmung mit einem bestimmten Textmuster (Pattern) durchsuchen kann.

Das Textmuster setzt man, indem man der Pattern Eigenschaft des RegExp Objektes einen regulären Ausdruck zuweist.

Dieser Ausdruck (im Beispiel "^.+@.+\...+$") enthält (auf den ersten Blick schwer lesbar) eine Beschreibung (Muster), wie eine "zutreffende" Textstelle auszusehen hat. Ein ausführliche Beschreibung von Pattern finden Sie unter Suchmuster (Pattern)

Um nun eine Zeichenkette nach Textstellen zu durchsuchen die zum Suchmuster (Pattern) passen, kann man die Execute Methode des RegExp Objekts benutzen.

Execute liefert als Ergebnis eine sogenannte Matches Collection (alle Treffer) zurück. Die einzelnen Objekte der Matches Collection sind die Match (Treffer) Objekte. Diese enthalten Informationen über jene Textstellen, die zum regulären Ausdruck (Pattern Eigenschaft des RegExp Objektes) passen: Position der Textstelle in der Zeichenkette, Länge der passenden Textstelle, den Wert der Textstelle (also der passende Ausschnitt aus der Zeichenkette).

Die Count Eigenschaft der Matches Collection enthält einfach nur die Anzahl der passenden Textstellen (also die Anzahl der Match Objekte).

In den folgenden Absätzen möchte ich auf die Möglichkeiten eingehen, die man bei der Definition eines Suchmusters (Pattern) hat.

Suchmuster (Pattern)

Das Wesen des regulären Ausdruckes "^.+@.+\...+$" ist ein wenig komplexer, ich werde die Einzelheiten später genauer erläutern.

Zuerst ein kurzer Überblick über die wichtigsten Sonderzeichen, die man in regulären Ausdrücken verwendet:

  • \ : Vor ein Sonderzeichen gestellt, damit das Zeichen als Zeichen und nicht als Sonderzeichen interpretiert wird. Dient auch zusammen mit speziellen Buchstaben zur Kennzeichnung von Zeilenumbrüchen (\n) oder für eine allgemeine Zahl (\d)
  • ( und ) : Schließen eine Ausdruck ein. Um nach Klammern "(" oder ")" zu suchen benutzen Sie "\(" und "\)".
  • x|y : Trifft auf jede Textstelle zu, in der entweder x oder y vorkommmt. Um alle Textstellen zu suchen, die entweder "de", "at" oder "ch" enthalten, kann man nach dem regulären Ausdruck "(de|at|ch)" suchen. Um nach "Tisch" und "Fisch" zu suchen kann man den Ausdruck "(T|F)isch" benutzen.
  • . : Ist ein Platzhalter für ein beliebiges Zeichen. So passen zum Ausdruck ".age" die Worte "Sage", "Lage", "Tage". Um nach einen Punkt zu suchen muß man den Punkt mit "\" kennzeichnen. Der Pattern "\.at" paßt also zu ".at". Der Pattern Ausdruck "\..." passt zu allen Textstellen, die aus einem Punkt und zwei beliebigen Zeichen bestehen (".de",".at", aber auch ".z.").
  • \d : Kennzeichnet eine Zahl (engl. Digit) von 0 bis 9. So paßt der Pattern "\d\d/\d\d/\d\d" zu "27/02/00". Der Ausdruck "\d\d\." passt zu "17.", "08." oder "33.".
  • \D : Steht für ein beliebiges Zeichen, daß allerdings keine Zahl sein darf.
  • \w : Entspricht einem Schriftzeichen, wie es in Worten Verwendung findet. Von a bis z, A bis Z, 0 bis 9 und Unterstrich "_". Zum Beispiel paßt der Pattern "\.\w\w\w" zu ".asp", aber nicht zu ". ", ".7-9", ".@at" usw.
  • * : Das vorhergehende Zeichen kann von gar nicht bis beliebig oft vorkommen. Der Ausdruck "Al*" paßt zu den Textstellen "A", "Al", "Alllll".
  • + : Das vorhergehende Zeichen muß mindestens einmal vorkommen. Der Ausdruck "Se+" paßt zu "Se" und "See" aber nicht zu "S".
  • ? : Das voranstehende Zeichen darf höchstens einmal vorkommen. So passt der Ausdruck "a?e" zu "ae" und "e".
  • [abc] : Die eckigen Klammern begrenzen einen Satz von Zeichen, von denen eines an der Stelle des Ausdrucks vorkommen muß. So paßt der Ausdruck "[BRS]aum" zu den Textstellen "Baum", "Raum", "Saum".
  • [^abc] : Ein "negativer" Satz von Zeichen. Anstelle des Ausdrucks darf jedes Zeichen stehen, daß nicht im Ausdruck vorkommt. Der Ausdruck "Te[^aism]" paßt zum Beispiel zu den Textstellen "Tee" und "Ter".
  • [a-z] : Ein Bereich von Zeichen. Der Ausdruck "[a-f]77" paßt zu "a77", "e77" aber nicht zu "z77". Der Ausdruck "[1-3]. Platz" paßt zu "1. Platz", aber nicht zu "4. Platz".
  • [^a-z] : Ein "negativer" Bereich. Der Ausdruck steht als Platzhalter für ein beliebiges Zeichen, das nicht in den spezifizierten Bereich fallen darf.

Die Aufzählung der vorhergehenden Tabelle ist nicht vollständig. Allerdings enthält die VBScript Dokumentation die vollständige Liste.

Um noch einmal zum Ausdruck des ASP Listings zurückzukommen. Die Bedeutung der einzelnen Teile des Ausdrucks "^.+@.+\...+$" lautet wie folgt:

  • ^ steht für den Anfang (den linken Rand) einer Zeichenkette. Das Muster kann also nur am Anfang der Zeichenkette "passen".
  • . ist ein beliebiges Zeichen. Das + bedeutet, daß das vorhergehende Zeichen einmal oder öfter vorkommen muß. Daher ist .+ der Platzhalter für ein oder mehrere beliebige Zeichen.
  • @ steht einfach für das Zeichen "@".
  • \ kennzeichnet das nächste Zeichen als Sonderzeichen. \. steht einfach für "." (Punkt).
  • . bedeutet ein beliebiges Zeichen.
  • .+ steht für ein oder mehrere beliebige Zeichen.
  • $ steht für das Ende (den rechten Rand) einer Zeichenkette. Das Muster muß also mit den Ende der Zeichenkette abschließen.

Die Replace Methode des RegExp Objektes

Mit Hilfe der Replace Methode kann man eine Zeichenkette nach bestimmten Textmustern (Pattern) durchsuchen, und die gefundenen Textstellen durch einen anderen Text ersetzen.

Die Verwendung ist wie folgt:

<%
  Set objRegAusdr = New RegExp
  ' ### Setzten des Suchmusters (Pattern)
  objRegAusdr.Pattern = "ist"
  ' ### Alle Pattern austauschen
  objRegAusdr.Global = True
  strA = "Dies ist ein Test."
  strB = "war"
  ' ### Alle Pattern in strA gegen strB austauschen
  strA = objRegAusdr.Replace(strA, strB)
  Response.Write(strA)
%>

Nachdem das RegExp Objekt generiert und die Suchpattern gesetzt sind, kann man in einer beliebigen Zeichenkette (strA) die zum Suchmuster passenden Textstellen gegen eine andere Zeichenkette (strB) austauschen.

Dadurch, daß die Global Eigenschaft des RegExp Objektes auf True gesetzt ist werden alle Textstellen, die zum Pattern passen ausgetauscht. Hätte Global den Wert False, so würde nur die erste passende Textstelle ausgetauscht werden

Die Test Methode des RegExp Objektes

Mit Hilfe der Test Methode lässt sich feststellen, ob die Pattern ein- oder mehrmals in einer Zeichenkette vorkommen. Dies illustriert das folgende Beispiel.

<%
  Set objRegAusdr = New RegExp
  ' ### Setzten des Suchmusters (Pattern)
  objRegAusdr.Pattern = "ist"
  strA = "Dies ist ein Test."
  ' ### Alle Pattern in strA gegen strB austauschen
  boolGefunden = objRegAusdr.Test(strA)
  If boolGefunden = True Then
    Response.Write("Pattern in Text gefunden!")
  Else
    Response.Write("Pattern nicht gefunden!")
  End If
%>

Die Matches (Treffer) Collection

Die Matches Collection enthält alle Textstellen einer Zeichenkette, die zu den Pattern des RegExp Objektes passen. Die Matches Collection erhält man, indem man ein RegExp Objekt erstellt, die Pattern setzt und dann die Execute Methode des RegExp Objektes ausführt.

objRegAusdr = New RegExp
...
Set Matches = objRegAusdr.Execute(strMatchString)

Man kann dann die Collection durchlaufen, zum Beispiel in einer For Each ... Next Schleife, und die folgenden Informationen zu jeder gefundenen Textstelle auslesen: Position des passenden Textes, genauer Text an der Fundstelle, Länge des passenden Textes.

...
For Each Match in Matches
   ...
Next

Dazu stellt jedes Match Objekt der Matches Collection die folgenden Eigenschaften zur Verfügung:

  • FirstIndex : Gibt die Position der gefundenen Textstelle zurück. Der Wert ist dabei 0-basierend, daher wird ein Fund am Anfang der Zeichenkette durch den Wert 0 (Null) angezeigt. Eine passende Textstelle, die mit dem 3. Buchstaben der Zeichenkette beginnt, gibt den Wert 2 in der FirstIndex Eigenschaft zurück.
  • Value : Enthält den genauen Wert der gefundenen Textstelle.
  • Length : Spezifiziert die Länge der passenden Textstelle.

...
For Each Match in Matches
   Response.Write("FirstIndex: ")
   Response.Write(Match.FirstIndex & "<br>")
   Response.Write("Value: ")
   Response.Write(Match.Value & "<br>")
   Response.Write("Length: "
   Response.Write(Match.Length & "<br>")
   Response.Write("<br>" & vbcrlf)
Next

Schlußbemerkung

Reguläre Ausdrücke und das RegExp Objekt erlauben ein effizientes Suchen nach spezifischen Textstellen in einer Zeichenkette. Mit Hilfe der Replace Methode kann man darüber hinaus in einem Text auf sehr bequeme Weise definierte Textstellen durch einen anderen Text ersetzen.

Verwandte Artikel

Eigene Tags - User Input einfach und sicher
Gegengifte für SQL Injection
Meta Tags von fremden Seiten parsen
Regex'en zu Assemblies kompilieren
Verhinderung von SQL Injection Marke .NET

Links zu anderen Sites

VBScript Engine (deutsch)
VBScript Engine (US)

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.

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.