Reguläre Ausdrücke (Regulärer Ausdruck) bieten eine effiziente und praktische Methode zum Vergleichen von Zeichenfolgenmustern. Fast alle Hochsprachen unterstützen reguläre Ausdrücke oder stellen vorgefertigte Codebibliotheken zum Aufruf bereit. In diesem Artikel werden allgemeine Verarbeitungsaufgaben in der ASP-Umgebung als Beispiel verwendet, um die Anwendungsfähigkeiten regulärer Ausdrücke vorzustellen.
1. Überprüfen Sie das Format von Passwörtern und E-Mail-Adressen.
Unser erstes Beispiel demonstriert eine Grundfunktion regulärer Ausdrücke: die abstrakte Beschreibung beliebig komplexer Zeichenfolgen. Dies bedeutet, dass reguläre Ausdrücke Programmierern eine formale Methode zur Zeichenfolgenbeschreibung bieten, mit der sie jedes von der Anwendung gefundene Zeichenfolgenmuster mit nur wenig Code beschreiben können. Für Personen, die nicht technisch tätig sind, können die Anforderungen an das Passwortformat beispielsweise wie folgt beschrieben werden: Das erste Zeichen des Passworts muss ein Buchstabe sein, das Passwort muss mindestens 4 Zeichen und darf nicht mehr als 15 Zeichen lang sein. Das Passwort darf nur Buchstaben, Zahlen und Zeichen außer dem Unterstrich enthalten.
Als Programmierer müssen wir die obige Beschreibung des Passwortformats in natürlicher Sprache in andere Formen umwandeln, damit die ASP-Seite sie verstehen und anwenden kann, um eine illegale Passworteingabe zu verhindern. Der reguläre Ausdruck, der dieses Passwortformat beschreibt, ist: ^[a-zA-Z]w{3,14}$.
In ASP-Anwendungen können wir den Passwortüberprüfungsprozess als wiederverwendbare Funktion schreiben, wie unten gezeigt:
Funktion TestPassword(strPassword)
Dim re
Setze re = new RegExp
re.IgnoreCase = false
re.global = false
re.Pattern = "^[a-zA-Z]w{3,14}$"
TestPassword = re.Test(strPassword)
Endfunktion
Im Folgenden vergleichen wir den regulären Ausdruck zur Überprüfung des Passwortformats mit der Beschreibung in natürlicher Sprache:
Das erste Zeichen des Passworts muss ein Buchstabe sein: Die Beschreibung des regulären Ausdrucks lautet „^[a-zA-Z]“, wobei „ ^“ gibt den Anfang der Zeichenfolge an und der Bindestrich weist RegExp an, alle Zeichen im angegebenen Bereich abzugleichen.
Das Passwort muss mindestens 4 Zeichen und darf nicht mehr als 15 Zeichen lang sein: Die Beschreibung des regulären Ausdrucks lautet „{3,14}“.
Das Passwort darf keine anderen Zeichen als Buchstaben, Zahlen und Unterstriche enthalten: Die Beschreibung des regulären Ausdrucks lautet „w“.
Ein paar Anmerkungen: {3, 14} bedeutet, dass das vorherige Muster mit mindestens 3, aber nicht mehr als 14 Zeichen übereinstimmt (zuzüglich des ersten Zeichens ergeben sich daraus 4 bis 15 Zeichen). Beachten Sie, dass die Syntax in geschweiften Klammern äußerst streng ist und keine Leerzeichen auf beiden Seiten des Kommas zulässt. Wenn Leerzeichen hinzugefügt werden, wirkt sich dies auf die Bedeutung des regulären Ausdrucks aus und führt zu Fehlern bei der Überprüfung des Passwortformats. Außerdem wird das Zeichen „$“ am Ende des obigen regulären Ausdrucks nicht hinzugefügt. Das Zeichen „$“ bewirkt, dass der reguläre Ausdruck bis zum Ende mit der Zeichenfolge übereinstimmt und so ein gültiges Passwort ohne weitere darauffolgende Zeichen gewährleistet.
Ähnlich wie bei der Überprüfung des Passwortformats ist auch die Überprüfung der Legitimität von E-Mail-Adressen ein sehr häufiges Problem. Die Verwendung regulärer Ausdrücke zur Durchführung einer einfachen Überprüfung der E-Mail-Adresse kann wie folgt implementiert werden:
<%
Dim re
Setze re = new RegExp
re.pattern = "^w+@[a-zA-Z_]+?.[a-zA-Z]{2,3}$"
Response.Write re.Test(" [email protected] ")
%>
2. Bestimmte Teile der HTML-Seite extrahieren
Das Hauptproblem beim Extrahieren von Inhalten aus der HTML-Seite besteht darin, dass wir einen Weg finden müssen, den gewünschten Teil des Inhalts genau zu identifizieren. Das Folgende ist beispielsweise ein HTML-Codeausschnitt, der Nachrichtenschlagzeilen anzeigt:
<table border="0" width="11%" class="Somestory">
<tr>
<td width="100%">
<p align="center">Anderer Inhalt...</td>
</tr>
</Tabelle>
<table border="0" width="11%" class="Headline">
<tr>
<td width="100%">
<p align="center">Krieg im Irak! </td>
</tr>
</Tabelle>
<table border="0" width="11%" class="Someotherstory">
<tr>
<td width="100%">
<p align="center">Anderer Inhalt...</td>
</tr>
</table>
Wenn Sie den obigen Code betrachten, ist es leicht zu erkennen, dass der Nachrichtentitel in der Tabelle in der Mitte angezeigt wird und sein Klassenattribut auf Headline gesetzt ist. Wenn die HTML-Seite sehr komplex ist, können Sie eine zusätzliche Funktion von Microsoft IE ab 5.0 verwenden, um nur den HTML-Code des ausgewählten Teils der Seite anzuzeigen. Bitte besuchen Sie http://www.microsoft.com/Windows/ie /WebAccess/default.ASP Weitere Informationen. Für dieses Beispiel gehen wir davon aus, dass dies die einzige Tabelle ist, deren Klassenattribut auf „Headline“ gesetzt ist. Jetzt müssen wir einen regulären Ausdruck erstellen, diese Headline-Tabelle über den regulären Ausdruck finden und diese Tabelle in unsere eigene Seite einbinden. Die erste besteht darin, Code zu schreiben, der reguläre Ausdrücke unterstützt:
<%
Dim re, strHTML
Set re = new RegExp ' Erstellen Sie ein reguläres Ausdrucksobjekt
re.IgnoreCase = true
re.Global = false 'Suche nach dem ersten Treffer beenden
%>
Betrachten Sie nun den Bereich, den wir extrahieren möchten: Was wir hier extrahieren möchten, ist die gesamte <table>-Struktur, einschließlich des schließenden Tags und des Textes des Nachrichtentitels. Daher sollte das Startzeichen der Suche das Start-Tag <table> sein: re.Pattern = "<table.*(?=Headline)". Dieser reguläre Ausdruck entspricht dem Start-Tag der Tabelle und kann alles zwischen dem Start-Tag und „Headline“ zurückgeben (außer Zeilenumbrüche). So geben Sie den übereinstimmenden HTML-Code zurück:
„Fügen Sie alle übereinstimmenden HTML-Codes in die Matches-Sammlung ein.“
Set Matches = re.Execute(strHTML)
'Alle passenden HTML-Codes anzeigen
Für jedes Element in Übereinstimmungen
Response.Write Item.Value
Weiter
„Zeigen Sie einen der
Response.write Matches.Item(0).Value
führt diesen Code aus, um das zuvor gezeigte HTML-Fragment zu verarbeiten. Der reguläre Ausdruck gibt den Inhalt einer Übereinstimmung wie folgt zurück: <table border="0" width="11%" class=" . Regulärer Ausdruck Das „(?=Headline)“ im Ausdruck erhält die Zeichen nicht, daher ist der Wert des Tabellenklassenattributs auch recht einfach: re.Pattern = „<table.*(?=Headline) (.|n)*?</table>“. Darunter: „*“ nach „(.|n)“ entspricht 0 bis mehr beliebigen Zeichen;
„Minimiertden
„*“-Übereinstimmungsbereich, d. h. es werden so wenige Zeichen wie möglich gefunden, bevor der nächste Teil des Ausdrucks gefunden wird
Wenn Sie beispielsweise für das oben angegebene HTML-Code-Snippet dieses „?“ löschen, lautet der zurückgegebene Inhalt:
<table border="0" width="11%" class=" Überschrift">
<tr>
<td width="100%">
<p align="center">Krieg im Irak! </td>
</tr>
</Tabelle>
<table border="0" width="11%" class="Someotherstory">
<tr>
<td width="100%">
<p align="center">Anderer Inhalt...</td>
</tr>
</Tabelle>
Der zurückgegebene Inhalt enthält nicht nur das <table>-Tag der Headline-Tabelle, sondern auch das „?“-Tag.
Dieses Beispiel geht von einigen ziemlich idealistischen Prämissen aus. In tatsächlichen Anwendungen ist die Situation oft viel komplizierter, insbesondere wenn man keinen Einfluss auf das Schreiben des verwendeten HTML-Quellcodes hat, ist das Schreiben von ASP-Code besonders schwierig. Die effektivste Methode besteht darin, mehr Zeit damit zu verbringen, den HTML-Code in der Nähe des zu extrahierenden Inhalts zu analysieren und häufig zu testen, um sicherzustellen, dass der extrahierte Inhalt genau Ihren Anforderungen entspricht. Darüber hinaus sollten Sie auf die Situation achten und damit umgehen, in der der reguläre Ausdruck mit keinem Inhalt der Quell-HTML-Seite übereinstimmen kann. Inhalte können sich sehr schnell ändern. Es sollte also nicht zu lächerlichen Fehlern auf Ihrer Seite kommen, nur weil jemand anderes das Format des Inhalts geändert hat.
3. Textdatendateien analysieren
Es gibt viele Formate und Arten von Datendateien. Strukturierter Text und sogar unstrukturierter Text werden häufig zu Datenquellen für ASP-Anwendungen. Ein Beispiel, das wir uns unten ansehen werden, ist eine strukturierte Textdatei mit Qualifizierern. Qualifizierer (z. B. Anführungszeichen) geben an, dass die Teile der Zeichenfolge untrennbar miteinander verbunden sind, auch wenn die Zeichenfolge Trennzeichen enthält, die den Datensatz in Felder unterteilen.
Das Folgendeist
eine einfach strukturierte Textdatei:
Nachname, Vorname, Telefonnummer, Beschreibung. Sun, Wukong, 312 555 5656, ASP ist sehr gut, Pig, Bajie, 847 555 5656, ich bin ein Filmproduzent
Einfach: Die erste Zeile ist der Titel und die folgenden beiden Zeilen sind die durch Kommas getrennten Datensätze. Das Parsen dieser Datei ist ebenfalls sehr einfach. Teilen Sie die Datei einfach in Zeilen auf (entsprechend den Zeilenumbruchsymbolen) und teilen Sie dann jeden Datensatz nach Feldern auf. Wenn wir jedoch Kommas zu einem bestimmten Feldinhalt hinzufügen:
Nachname, Vorname, Telefonnummer, Beschreibung Sun, Wukong, 312 555 5656, mag ich ASP, VB und SQL
Pig, Bajie, 847 555 5656, ich bin ein Filmproduzent.
Beim Parsen des ersten Datensatzes tritt ein Problem auf, da in der Ansicht eines Parsers, der nur Kommatrennzeichen erkennt, das letzte Feld den Inhalt von zwei Feldern enthält. Um Probleme dieser Art zu vermeiden, müssen Felder, die Trennzeichen enthalten, von Qualifikationsmerkmalen umgeben sein. Einfache Anführungszeichen sind ein häufig verwendetes Qualifikationsmerkmal. Nach dem Hinzufügen des einfachen Anführungszeichens zur obigen Textdatei sieht der Inhalt wie folgt aus:
Nachname, Vorname, Telefonnummer, Beschreibung Sun, Wukong, 312 555 5656, „Ich mag ASP, VB und SQL“
Zhu, Bajie, 847 555 5656, „Ich bin Filmproduzent“
Jetzt können wir bestimmen, welches Komma das Trennzeichen und welches Komma der Feldinhalt ist, d. h. wir müssen nur die Kommas innerhalb der Anführungszeichen als Inhalt betrachten des Feldes. Als nächstes müssen wir einen Parser für reguläre Ausdrücke implementieren, der bestimmt, wann Felder anhand von Kommas aufgeteilt werden und wann Kommas als Feldinhalt behandelt werden.
Das Problem ist hier etwas anders als bei den meisten regulären Ausdrücken. Normalerweise schauen wir uns einen kleinen Textabschnitt an, um zu sehen, ob er mit einem regulären Ausdruck übereinstimmt. Aber hier können wir nur dann zuverlässig sagen, was in Anführungszeichen steht, wenn wir die gesamte Textzeile betrachten.
Hier ist ein Beispiel, das das Problem veranschaulicht. Extrahieren Sie zufällig eine halbe Zeile Inhalt aus einer Textdatei und erhalten Sie: 1, Strand, Schwarz, 21, ', Hund, Katze, Ente, ', . Da sich in diesem Beispiel links von „1“ weitere Daten befinden, ist es äußerst schwierig, deren Inhalt zu analysieren. Wir wissen nicht, wie viele einfache Anführungszeichen vor diesem Datenfragment stehen, daher können wir nicht bestimmen, welche Zeichen in den Anführungszeichen enthalten sind (Text in Anführungszeichen kann beim Parsen nicht geteilt werden). Wenn dem Datenfragment eine gerade Zahl (oder keine) in einfache Anführungszeichen vorangestellt ist, dann ist „', dog, cat, duck, '“ eine in Anführungszeichen gesetzte Zeichenfolge und unteilbar. Wenn die Anzahl der vorangehenden Anführungszeichen eine ungerade Zahl ist, dann ist „1, beach, black, 21, '“ das Ende einer Zeichenfolge und unteilbar.
Daher muss der reguläre Ausdruck die gesamte Textzeile analysieren und dabei berücksichtigen, wie viele Anführungszeichen erscheinen, um festzustellen, ob sich das Zeichen innerhalb oder außerhalb des Anführungszeichenpaars befindet, d. h.:,(?=([^']*'[ ^']*') *(?![^']*')). Dieser reguläre Ausdruck findet zunächst ein Anführungszeichen, setzt dann die Suche fort und stellt sicher, dass die Anzahl der einfachen Anführungszeichen nach dem Komma entweder eine gerade Zahl oder Null ist. Dieser reguläre Ausdruck basiert auf der folgenden Beurteilung: Wenn die Anzahl der einfachen Anführungszeichen nach dem Komma gerade ist, liegt das Komma außerhalb der Zeichenfolge. Die folgende Tabelle enthält detailliertere Anweisungen:
, nach einem Komma suchen
(?= sucht weiter vorwärts, um dieses Muster zu finden:
(Starten Sie ein neues Muster
[^']*' [Zeichen ohne Anführungszeichen] 0 oder mehr, gefolgt von einem Anführungszeichen
[^']*'[^']*) [Zeichen ohne Anführungszeichen] 0 oder mehr, gefolgt von einem Anführungszeichen. In Kombination mit dem vorherigen Inhalt werden Anführungszeichenpaare gefunden
)* beendet das Muster und stimmt mit dem gesamten Muster (Anführungszeichenpaaren) 0-mal oder öfter überein
(?! Vorwärts suchen, dieses Muster ausschließen
[^']*' [Zeichen ohne Anführungszeichen] 0 oder mehr, gefolgt von einem Anführungszeichen
) Unterhalb des Endmodus
befindet sich eine VBScript-Funktion, die einen Zeichenfolgenparameter akzeptiert, die Zeichenfolge entsprechend dem Kommatrennzeichen und dem einfachen Anführungszeichen in der Zeichenfolge aufteilt und das Ergebnisarray zurückgibt:
Funktion SplitAdv(strInput)
Dim objRE
Set objRE = new RegExp
'RegExp-Objekt festlegen
objRE.IgnoreCase = true
objRE.Global = true
objRE.Pattern = ",(?=([^']*'[^']*')*(?![^']*'))"
' Die Remove-Methode verwendet chr(8), um das zu ersetzen, was wir wollen Um Komma zu verwenden, ist chr(8)b
'-Zeichen, b kann äußerst selten in einer Zeichenfolge vorkommen.
' Dann teilen wir den String entsprechend b auf und speichern ihn im Array
SplitAdv = Split(objRE.Replace(strInput, "b"), "b")
Endfunktion
Kurz gesagt, die Verwendung regulärer Ausdrücke zum Parsen von Textdatendateien bietet den Vorteil einer hohen Effizienz und einer Verkürzung der Entwicklungszeit. Sie kann viel Zeit beim Analysieren von Dateien und beim Extrahieren nützlicher Daten basierend auf komplexen Bedingungen sparen. In einem sich schnell entwickelnden Umfeld, in dem immer noch viele traditionelle Daten verfügbar sind, wird es eine wertvolle Fähigkeit sein, zu wissen, wie man effiziente Datenanalyseroutinen erstellt.
4. String-Ersetzung
Im letzten Beispiel werden wir uns die Ersetzungsfunktion von regulären VBScript-Ausdrücken ansehen. ASP wird häufig zum dynamischen Formatieren von Text verwendet, der aus verschiedenen Datenquellen stammt. Mithilfe der Leistungsfähigkeit regulärer VBScript-Ausdrücke kann ASP passende komplexe Texte dynamisch ändern. Das Hervorheben einiger Wörter durch Hinzufügen von HTML-Tags ist eine häufige Anwendung, beispielsweise das Hervorheben von Suchbegriffen in Suchergebnissen.
Um zu veranschaulichen, wie dies geschieht, schauen wir uns ein Beispiel an, das alle „.NET“ in einer Zeichenfolge hervorhebt. Diese Zeichenfolge kann von überall abgerufen werden, beispielsweise aus einer Datenbank oder einer anderen Website.
<%
Setze regEx = New RegExp
regEx.Global = true
regEx.IgnoreCase = True
'reguläres Ausdrucksmuster,
'Suchen Sie nach einem Wort oder einer URL, die mit „.NET“ endet.
regEx.Pattern = "(b[a-zA-Z._]+?.NETb)"
' Zeichenfolge, die zum Testen der Ersetzungsfunktion verwendet wird
strText = „Microsoft hat eine neue Website www.ASP.NET erstellt.“
'Rufen Sie die Ersetzungsmethode des regulären Ausdrucks auf
„$1“ bedeutet, dass der übereinstimmende Text an der aktuellen Position eingefügt wird
Response.Write regEx.Replace(strText, _
"<b style='color: #000099; Schriftgröße: 18pt'>$1</b>")
%>
In diesem Beispiel müssen einige wichtige Punkte beachtet werden. Der gesamte reguläre Ausdruck wird in ein Klammerpaar gesetzt und seine Funktion besteht darin, den gesamten übereinstimmenden Inhalt für die spätere Verwendung abzufangen, auf den im Ersetzungstext durch $1 verwiesen wird. Bis zu 9 ähnliche Interceptions können pro Substitution verwendet werden, referenziert durch jeweils 1 bis 9 US-Dollar. Die Ersetzungsmethode regulärer Ausdrücke unterscheidet sich von der Ersetzungsfunktion von VBScript selbst. Sie erfordert nur zwei Parameter: den zu durchsuchenden Text und den zu ersetzenden Text.
Um in diesem Beispiel die gesuchten „.NET“-Strings hervorzuheben, umgeben wir sie mit fett gedruckten Tags und anderen Stilattributen. Mit dieser Such- und Ersetzungstechnologie können wir ganz einfach die Funktion zum Hervorheben von Suchbegriffen zum Website-Suchprogramm hinzufügen oder automatisch Links zu anderen Seiten für Schlüsselwörter hinzufügen, die auf der Seite erscheinen.
Fazit
Ich hoffe, dass die verschiedenen in diesem Artikel vorgestellten Techniken für reguläre Ausdrücke Sie inspiriert haben, wann und wie Sie reguläre Ausdrücke anwenden. Obwohl die Beispiele in diesem Artikel in VBScript geschrieben sind, sind reguläre Ausdrücke auch in ASP.NET nützlich. Sie sind einer der Hauptmechanismen für die serverseitige Kontrollformularvalidierung und werden über das System in den gesamten .Text.RegularExpressions-Namespace exportiert .Text.RegularExpressions-Namespace.