Wählen Sie das Zeichen "|" aus, um zwischen zwei oder mehr Kandidaten auszuwählen. Durch die Erweiterung des regulären Ausdrucks des Kapitels Titel kann er in einen Ausdruck erweitert werden, der mehr als nur für den Kapitel -Titel gilt. Dies ist jedoch nicht so direkt wie erwartet. Bei Verwendung der Auswahl wird der wahrscheinlichste Ausdruck für jede Seite des '|' übereinstimmend. Sie könnten denken, dass die folgenden Jscript- und VBScript -Ausdrücke mit dem "Kapitel" oder "Abschnitt" zu Beginn- und Endpositionen einer Zeile übereinstimmen und von ein oder zwei Zahlen gefolgt werden:
/^Chapter|Section [1-9][0-9]{0,1}$/ ^Chapter|Section [1-9][0-9]{0,1}___FCKpd___0quot;Leider ist der reale Fall, dass der oben gezeigte reguläre Ausdruck entweder mit dem Wort "Kapitel" zu Beginn einer Zeile übereinstimmt oder mit dem Abschnitt "Abschnitt" am Ende einer Zeile gefolgt von einer beliebigen Zahl übereinstimmt. Wenn die Eingabezeichenfolge "Kapitel 22" ist, stimmt der obige Ausdruck nur mit dem Wort "Kapitel" überein. Wenn die Eingangszeichenfolge "Abschnitt 22" ist, stimmt der Ausdruck mit 'Abschnitt 22' überein. Aber dieses Ergebnis ist hier nicht unser Zweck, daher muss es einen Weg geben, regelmäßige Ausdrücke mehr auf das zu machen, was sie tun werden, und es gibt tatsächlich einen solchen Weg.
Klammern können verwendet werden, um den Auswahlbereich zu begrenzen, dh klar, dass die Wahl nur für die beiden Wörter 'Kapitel' und 'Abschnitt' gilt. Klammern sind jedoch auch schwer zu handhaben, da sie auch zur Erstellung von Unterexpressionen verwendet werden, und einige werden später im Abschnitt über Subtexpressionen eingeführt. Durch den oben gezeigten regulären Ausdruck und das Hinzufügen von Klammern am entsprechenden Ort kann der reguläre Ausdruck sowohl mit "Kapitel 1" als auch "Abschnitt 3" übereinstimmen.
Der folgende reguläre Ausdruck verwendet Klammern zum Gruppenkapitel und "Abschnitt", damit der Ausdruck korrekt funktioniert. Für Jscript:
/^(Chapter|Section) [1-9][0-9]{0,1}$/Für VBScript:
^(Chapter|Section) [1-9][0-9]{0,1}___FCKpd___2quot;Diese Ausdrücke funktionieren korrekt und produzieren einfach ein interessantes Nebenprodukt. Durch das Platzieren von Klammern auf beiden Seiten von 'Kapitel | Abschnitt' werden eine angemessene Gruppierung erstellt, aber auch eines der beiden Wörter, die für die zukünftige Verwendung erfasst werden können. Da der oben gezeigte Ausdruck nur einen Satz von Klammern gibt, kann es nur einen erfassten Submatch geben. Dieser Untermatch kann mit der Submatches -Sammlung von VBScript oder den $ 1- $ 9- Attributen des Regexp- Objekts in JScript referenziert werden.
Manchmal ist es wünschenswert, manchmal unerwünscht, einen Unterabschnitt zu erfassen. In dem in der Beschreibung gezeigten Beispiel möchten Sie wirklich Klammern verwenden, um die Wahl zwischen den Wörtern 'Kapitel' oder 'Abschnitt' zu gruppieren. Es ist nicht wünschenswert, sich später auf das Match zu verweisen. Tatsächlich verwenden Sie bitte nur, es sei denn, Sie müssen den Unter-Match wirklich erfassen. Dieser reguläre Ausdruck ist effizienter, da er keine Zeit und keinen Speicher benötigt, um diese Unterübereinstimmungen zu speichern.
Sie können '?:' Vor dem regulären Ausdrucksmuster -Klammern verwenden, um zu verhindern, dass diese Übereinstimmung für die zukünftige Verwendung speichert. Die folgenden Modifikationen des oben gezeigten regulären Ausdrucks liefern die gleiche Funktionalität, die den Submatch -Speicher beseitigt. Für Jscript:
/^(?:Chapter|Section) [1-9][0-9]{0,1}$/Für VBScript:
^(?:Chapter|Section) [1-9][0-9]{0,1}___FCKpd___4quot;Zusätzlich zum Metacharacter '?:' Metacharacter gibt es zwei nicht kaufmische Metacharacer, die übereinstimmenden Prequer-Prequer verwendet werden. Ein Vorwärts-Pre-Check wird durch? Ein negativer Vorab der Überprüfung wird von '?!'
Angenommen, es gibt ein Dokument, das Verweise auf Windows 3.1, Windows 95, Windows 98 und Windows NT enthält. Angenommen, das Dokument muss aktualisiert werden, indem alle Verweise auf Windows 95, Windows 98 und Windows NT gesucht und diese Verweise auf Windows 2000 geändert werden. Sie können den folgenden regulären Ausdruck von Jscript verwenden, bei dem es sich um einen Vorwärts-Pre-Check handelt, um Windows 95, Windows 98 und Windows NT zu entsprechen:
/Windows(?=95 |98 |NT )/ Um das gleiche Übereinstimmung in VBSScript zu machen, können Sie den folgenden Ausdruck verwenden: Windows(?=95 |98 |NT )
Sobald eine Übereinstimmung gefunden wurde, beginnt die nächste Spielsuche unmittelbar nach dem passenden Text (ohne die in der Vorversuche verwendeten Zeichen). Wenn der oben gezeigte Ausdruck beispielsweise mit 'Windows 98' übereinstimmt, wird die Suche von 'Windows' anstelle von '98' fortgesetzt.
Eines der wichtigsten Merkmale regulärer Ausdrücke ist die Möglichkeit, einen Teil des passenden erfolgreichen Musters für die spätere Verwendung zu speichern. Erinnern Sie sich daran, dass das Hinzufügen von Klammern zu beiden Seiten eines regulären Expressionsmusters oder eines partiellen Musters dazu führt, dass der teilweise Ausdruck in einem temporären Puffer gespeichert wird. Die nicht kennzeichnenden Metacharacter '?:', '? =' Oder '?!' Kann verwendet werden, um die Speicherung dieses Teils des regulären Ausdrucks zu ignorieren.
Jeder erfasste Submatch wird als der Inhalt von links nach rechts im regulären Ausdrucksmuster gespeichert. Die Puffernummer, die Unterpatches speichert, beginnt bei 1 und wird nacheinander nummeriert, bis die maximalen 99 Subexpressionen. Auf jeden Puffer kann mit '/ n ' zugegriffen werden, wobei N eine ein- oder zweistellige Dezimalzahl ist, die einen bestimmten Puffer identifiziert.
Rückwärtszitat Eine der einfachsten und nützlichsten Anwendungen ist die Fähigkeit zu bestimmen, wo zwei identische Wörter in einem Text in Folge erscheinen. Bitte beachten Sie den folgenden Satz:
Is is the cost of of gasoline going up up?Nach dem geschriebenen Inhalt hat der obige Satz offensichtlich das Problem der wiederholten Wörter. Es wäre großartig, wenn es eine Möglichkeit gäbe, den Satz zu ändern, ohne nach Wiederholung jedes Wortes zu suchen. Der folgende reguläre Jscript -Expression kann diese Funktion unter Verwendung einer Suberpression erreichen.
//b([az]+) /1/b/giDer äquivalente VBScript -Ausdruck lautet:
/b([az]+) /1/bIn diesem Beispiel ist die Subtonpression jedes Element zwischen Klammern. Der erfasste Ausdruck enthält einen oder mehrere alphabetische Zeichen, d. H. Von '[Az]+' angegeben. Der zweite Teil des regulären Ausdrucks ist ein Hinweis auf den zuvor erfassten Unter-Match, dh das zweite Auftreten des Wortes, das durch den zusätzlichen Ausdruck übereinstimmt. '/1' wird verwendet, um den ersten Submatch anzugeben. Wortgrenzenelementzeichen stellen sicher, dass nur einzelne Wörter erkannt werden. Wenn nicht, werden Phrasen wie ausgegeben oder dies wird durch den Ausdruck falsch erkannt.
In einem Jscript -Ausdruck bedeutet das globale Flag ('G'), der dem regulären Ausdruck folgt, dass der Ausdruck verwendet wird, um so viele Übereinstimmungen wie möglich in der Eingabezeichenfolge zu finden. Die Fallempfindlichkeit wird durch die Fallempfindlichkeitsmarke ('I') am Ende des Ausdrucks angegeben. Multi-Line-Tags geben potenzielle Übereinstimmungen an, die an beiden Enden eines neuen Charakters angezeigt werden können. Für VBScript können verschiedene Tags nicht in Ausdrücken festgelegt werden, sie müssen jedoch mithilfe der Eigenschaften des Regexp -Objekts explizit festgelegt werden.
Unter Verwendung des oben gezeigten regulären Ausdrucks kann der folgende Jscript-Code dasselbe Wort ersetzen, das zweimal in einer wörtlichen Zeichenfolge mit demselben Wort unter Verwendung von Sub-Match-Informationen angezeigt wird:
. var rv = ss.replace(re,$1); //var ss = Is is the cost of of gasoline going up up?./n; var re = //b([az]+) /1/b/gim; //. var rv = ss.replace(re,$1); //Ersetzen Sie zwei Wörter durch ein Wort.
Der nächstgelegene äquivalente VBScript -Code ist wie folgt:
Dim ss, re, rv ss = Is is the cost of of gasoline going up up?. & vbNewLine Set re = New RegExp re.Pattern = /b([az]+) /1/b re.Global = True re.IgnoreCase = True re.MultiLine = True rv = re.Replace(ss,$1)Beachten Sie, dass in VBScript-Code globale, Fallempfindlichkeit und Multi-Line-Tags unter Verwendung geeigneter Eigenschaften des Regexp- Objekts festgelegt werden.
Verwenden Sie $ 1 in der Ersatzmethode , um auf den gespeicherten ersten Untermatch zu verweisen. Wenn es mehrere Unterpinke gibt, können Sie weiterhin mit 2 USD , $ 3 usw. verweisen.
Eine weitere Verwendung von Rückwärtsreferenzen besteht darin, einen gemeinsamen Ressourcenindikator (URI) in Komponententeile zu unterteilen. Angenommen, Sie möchten die folgenden URI in Protokolle (FTP, HTTP usw.), Domänennamenadresse und Seite/Pfad zerlegen:
http://msdn.microsoft.com:80/scripting/default.htmDie folgenden regulären Ausdrücke können diese Funktion liefern. Für Jscript, als:
/(/w+):////([^/:]+)(:/d*)?([^# ]*)/Für VBScript:
(/w+):////([^/:]+)(:/d*)?([^# ]*)Die erste zusätzliche Unterexpression wird verwendet, um den Protokollabschnitt der Webadresse zu erfassen. Diese Unterexpression entspricht jedem Wort, das sich vor einem Dickdarm und zwei Stürmerströmen befindet. Die zweite zusätzliche Unterexpression erfasst die Domänennamenadresse dieser Adresse. Diese Unterexpression entspricht einer Zeichensequenz, die nicht '^', '/' oder ':' Zeichen enthält. Die dritte zusätzliche Unterexpression erfasst die Website -Portnummer, wenn die Portnummer angegeben ist. Diese Unterexpression entspricht null oder mehr Zahlen, gefolgt von einem Dickdarm. Schließlich erfasst der vierte zusätzliche Unterexpression den von der Webadresse und/oder den Seiteninformationen angegebenen Pfad. Diese Unterexpression entspricht einem und mehreren Zeichen mit Ausnahme von '#' oder Speicherplatz.
Nachdem dieser reguläre Ausdruck auf die oben gezeigten URI angewendet wurde, enthält der Unter-Match die folgenden:
Regexp. $ 1 enthält http
Regexp. $ 2 enthält msdn.microsoft.com
Regexp. $ 3 inklusive: 80
Regexp. $ 4 enthält /scripting/default.htm