Alternierung und Gruppierung
Aktualisiert: November 2007
Bei der Alternierung wird über das Zeichen | die Auswahl zwischen zwei oder mehreren Alternativen ermöglicht. Sie können z. B. den regulären Ausdruck für die Kapitelüberschrift so erweitern, dass er mehr als nur Kapitelüberschriften zurückgibt. Dies ist jedoch nicht ganz so einfach, wie es scheint. Bei der Alternierung wird eine Entsprechung für den größtmöglichen Ausdruck auf beiden Seiten des Zeichens | gefunden.
Beispiel
Nun könnte man annehmen, dass der folgende Ausdruck entweder Chapter oder Section, gefolgt von einer oder mehreren Ziffern am Anfang oder Ende einer Zeile entspricht:
/^Chapter|Section [1-9][0-9]{0,1}$/
Leider entspricht der obige reguläre Ausdruck aber entweder dem Wort Chapter am Anfang einer Zeile oder dem Wort Section und jeglichen Zahlen, die auf Section am Ende der Zeile folgen. Wenn die Eingabezeichenfolge Chapter 22 ist, entspricht der obige Ausdruck nur dem Wort Chapter. Wenn die Eingabezeichenfolge Section 22 ist, entspricht der Ausdruck Section 22.
Um den regulären Ausdruck zu präzisieren, können Sie den Gültigkeitsbereich der Alternierung mit runden Klammern einschränken, sodass diese nur für die beiden Wörter Chapter und Section gilt. Andererseits werden runde Klammern auch zum Erstellen von Teilausdrücken und zur Speicherung für die spätere Verwendung eingesetzt. Dieses Thema wird im Abschnitt über Rückverweise behandelt. Durch Einfügen von runden Klammern an den entsprechenden Stellen im obigen regulären Ausdruck können Sie festlegen, dass der reguläre Ausdruck entweder Chapter 1 oder Section 3 entspricht.
Im folgenden regulären Ausdruck werden Chapter und Section mithilfe von runden Klammern gruppiert, damit der Ausdruck korrekt funktioniert:
/^(Chapter|Section) [1-9][0-9]{0,1}$/
Obwohl diese Ausdrücke einwandfrei funktionieren, sorgen die Klammern um Chapter|Section dafür, dass eines der beiden übereinstimmenden Wörter für die zukünftige Verwendung erfasst wird. Da der obige Ausdruck nur einen Satz Klammern enthält, wird nur eine Teilentsprechung gespeichert. Auf diese Teilentsprechung kann mithilfe der $1-$9-Eigenschaften des RegExp-Objekts verwiesen werden.
Im obigen Beispiel gruppieren Sie mit den runden Klammern lediglich die Auswahl zwischen den Wörtern Chapter und Section. Damit die Entsprechung nicht für die spätere Verwendung gespeichert wird, platzieren Sie vor dem Muster für den regulären Ausdruck innerhalb der Klammern ein '?:'. Die folgende Modifikation bietet die gleichen Funktionen, ohne dass die Teilentsprechung gespeichert wird:
/^(?:Chapter|Section) [1-9][0-9]{0,1}$/
Zusätzlich zu den ?:-Metazeichen erstellen zwei weitere Metazeichen ohne Erfassung so genannte Lookahead-Entsprechungen. Ein positives Lookahead, das mit ?= angegeben wird, sucht nach Entsprechungen für die Suchzeichenfolge an jeder Stelle, an der ein übereinstimmendes Muster für den regulären Ausdruck in Klammern beginnt. Ein negatives Lookahead, welches mit ?! angegeben wird, sucht nach Entsprechungen für die Suchzeichenfolge an jeder Stelle, an der eine nicht mit dem Muster für den regulären Ausdruck übereinstimmende Zeichenfolge in Klammern beginnt.
Beispiel: Angenommen, Sie haben ein Dokument, das Verweise auf Windows 3.1, Windows 95, Windows 98 und Windows NT enthält. Sie müssen das Dokument aktualisieren, indem Sie alle Verweise auf Windows 95, Windows 98 und Windows NT auf Windows 2000 ändern. Der folgende Ausdruck, ein Beispiel für eine positive Lookahead-Suche, entspricht Windows 95, Windows 98 und Windows NT:
/Windows(?=95 |98 |NT )/
Sobald eine Entsprechung gefunden wurde, beginnt die Suche nach der nächsten Entsprechung unmittelbar nach dem entsprechenden Text ohne Einbeziehung der Zeichen in der Lookahead-Suche. Beispiel: Wenn der obige Ausdruck Windows 98 entspricht, wird die Suche nach Windows fortgesetzt, nicht nach 98.