Rückverweise in JScript
Aktualisiert: November 2007
Eines der wichtigsten Features von regulären Ausdrücken ist die Möglichkeit, einen Teil eines übereinstimmenden Musters für die spätere Verwendung zu speichern. Wie bereits erwähnt, bewirkt die Platzierung von runden Klammern um ein Muster für einen regulären Ausdruck oder einen Teil eines solchen Musters, dass dieser Teil des Ausdrucks in einem temporären Puffer gespeichert wird. Sie können diese Speicherung außer Kraft setzen, indem Sie die Metazeichen ohne Erfassung, ?:, ?= oder ?!, verwenden.
Verwenden von Rückverweisen
Jede erfasste Teilentsprechung wird in der Reihenfolge des Auftretens von links nach rechts in einem Muster für einen regulären Ausdruck gespeichert. Die Puffernummern beginnen mit 1 und enden mit maximal 99 erfassten Teilausdrücken. Auf jeden Puffer kann mit \n zugegriffen werden, wobei n eine oder zwei Dezimalziffern für die Angabe eines bestimmten Puffers ist.
Einer der einfachsten und nützlichsten Verwendungszwecke für Rückverweise ist die Möglichkeit, zwei identische, nebeneinander stehende Wörter im Text zu finden. Betrachten Sie den folgenden Satz:
Is is the cost of of gasoline going up up?
In diesem Satz kommen mehrere Wörter doppelt vor. Nun wäre es praktisch, eine Möglichkeit zur Korrektur des Satzes zu haben, ohne dass jedes Duplikat einzeln gesucht werden muss. Im folgenden regulären Ausdruck erledigt dies ein einziger Teilausdruck:
/\b([a-z]+) \1\b/gi
Der erfasste Ausdruck, wie durch [a-z]+ angegeben, enthält ein oder mehrere Buchstaben. Der zweite Teil des regulären Ausdrucks ist der Verweis auf die zuvor gespeicherte Teilentsprechung, d. h. das zweite Vorkommen des Wortes, das gerade durch den Klammerausdruck gefunden wurde. \1 gibt die erste Teilentsprechung an. Die Metazeichen für Wortgrenzen stellen sicher, dass nur ganze Wörter gefunden werden. Andernfalls würde dieser Ausdruck fälschlicherweise auch "is issued" oder "this is" finden.
Das global-Flag (g) nach dem regulären Ausdruck zeigt an, dass der Ausdruck auf so viele Entsprechungen in der Eingabezeichenfolge wie möglich angewendet wird. Das i-Flag am Ende des Ausdrucks gibt an, dass die Groß-/Kleinschreibung nicht beachtet wird (Case Insensitivity). Das multiline-Flag gibt an, dass potenzielle Entsprechungen auf beiden Seiten eines Zeilenendezeichens auftreten können.
Mit dem obigen regulären Ausdruck kann der folgende Code anhand der Teilentsprechungsinformationen ein Vorkommen von zwei aufeinander folgenden identischen Wörtern in einer Textzeichenfolge durch ein einziges Vorkommen desselben Wortes ersetzen:
var ss = "Is is the cost of of gasoline going up up?.\n";
var re = /\b([a-z]+) \1\b/gim; //Create regular expression pattern.
var rv = ss.replace(re,"$1"); //Replace two occurrences with one.
Die Verwendung von $1 innerhalb der replace-Methode bezieht sich auf die erste gespeicherte Teilentsprechung. Wären mehr als eine Teilentsprechung vorhanden, würden Sie mit $2, $3 usw. nacheinander auf diese verweisen.
Rückverweise können auch einen URI (Universal Resource Indicator) in seine Komponenten aufschlüsseln. Angenommen, Sie möchten den folgenden URI in das Protokoll (ftp, http usw.), die Domänenadresse und die Seite bzw. den Pfad zerlegen:
https://msdn.microsoft.com:80/scripting/default.htm
Hierzu verwenden Sie die folgenden regulären Ausdrücke:
/(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/
Der erste Teilausdruck in Klammern erfasst den Protokollteil der Webadresse. Dieser Teilausdruck entspricht jedem Wort, das vor einem Doppelpunkt und zwei normalen Schrägstrichen steht. Der zweite Teilausdruck in Klammern erfasst die Domänenadressteil der Adresse. Dieser Teilausdruck entspricht einem oder mehreren Zeichen, die nicht / oder : sind. Der dritte Teilausdruck in Klammern erfasst eine Anschlussnummer, falls eine solche angegeben ist. Dieser Teilausdruck entspricht null oder mehr Ziffern, die auf einen Doppelpunkt folgen. Dieser Teilausdruck darf nur einmal wiederholt werden. Der vierte Teilausdruck in Klammern schließlich erfasst den Pfad und/oder die Seite, der bzw. die in der Webadresse angegeben wird. Dieser Teilausdruck entspricht einer beliebigen Zeichenfolge, die kein # und keine Leerzeichen umfasst.
Wird der reguläre Ausdruck auf den obigen URI angewendet, enthalten die Teilentsprechungen Folgendes:
RegExp.$1 enthält "http"
RegExp.$2 enthält "msdn.microsoft.com"
RegExp.$3 enthält ":80"
RegExp.$4 enthält "/scripting/default.htm"