Regular Expression/Gruppierungen und Referenzen

Aus Foxwiki

Gruppierungen und Referenzen

Gruppierungen

Ausdrücke lassen sich mit runden Klammern ( und ) zusammenfassen:

(abc)+“ erlaubt ein „abc“, „abcabc“, „abcabcabc“ etc.

Rückreferenzen

Einige Implementierungen speichern die gefundenen Übereinstimmungen von Gruppierungen ab und ermöglichen deren Wiederverwendung im regulären Ausdruck oder bei der Textersetzung.

Diese werden Rückwärtsreferenzen (engl. back references) genannt.

Häufig wird dazu die Schreibweise \n oder $n verwendet, wobei n die Übereinstimmung der n-ten Gruppierung entspricht.

Eine Sonderstellung stellt dabei n=0 dar, das meist für die Übereinstimmung des gesamten regulären Ausdruck steht.

Beispiel * Ein Suchen und Ersetzen mit AA(.*?)BB als regulären Suchausdruck und \1 als Ersetzung ersetzt alle Zeichenketten, die von AA und BB eingeschlossen sind, durch den zwischen AA und BB enthaltenen Text.

  • D.h. AA und BB und der Text dazwischen werden ersetzt durch den Text, der ursprünglich zwischen AA und BB stand, also fehlen AA und BB im Ergebnis.

Geklammerte Ausdrücke referenzieren

Eine Teilzeichenkette, die auf einen geklammerten Teilausdruck gepasst hat, lässt sich durch "\n" referenzieren. Dabei steht "n" für eine einzelne Ziffer, die den n-ten geklammerten Teilausdruck auswählt.

Bezugnahme auf die Ergebnismenge

Bei den bisherigen Anweisungen wurde der gesamte Zeileninhalt ausgegeben. Es gibt jedoch die Möglichkeit, direkt auf die effektive Ergebnismenge oder einen Teil daraus Bezug zu nehmen.

Die hierfür erforderliche s-Anweisung führt kein Suchen und Ersetzen durch, sondern durchsucht den Datenstrom anhand der RE und bildet aufgrund des Ausdrucks in () nochmals eine Teilmenge, die ausgegeben werden kann.

 BeispielTESTEN!! 
Aus der folgenden Zeile soll nur das Element "blau" ausgegeben werden.
echo "-rot-blau-gelb" | sed 's/.*\(blau\).*/\1/g'

Die gesamte RE lautet: /.*blau.*/

Es soll jedoch nur der Teil der Ergebnismenge ausgegeben werden, der "blau" enthält. Folglich ist "blau" in runde Klammern zu setzen.

/.*\(blau\).*/
echo "-rot-blau-gelb" | sed 's/.*\(blau\).*/\1/g'
  • s"Suchen und Ersetzen", wobei kein "Ersetzen" durchgeführt wird
  • .*Beginn der RE: beliebiges Zeichen 0-n mal
  • \(blau\)"blau" soll, falls es sich aus der Ergebnismenge extrahieren läßt, ausgegeben werden
  • .*Ende der RE: beliebiges Zeichen 0-n mal
  • \1die Ergebnismenge der 1. geklammerten RE wird ausgegeben
  • bei mehreren REs, wird jeder RE eine Zahl zugeordnet: \1 = 1.RE \2 = 2.RE usw.

Praktische Anwendung von Rückreferenzen

Umschreiben einer URL

Image

Gruppierungen ohne Rückreferenz

engl. non-capturing Die Syntax lautet in den meisten Implementierungen (?:).

Regular expressionp-Dokumentationen weisen darauf hin, dass die Erzeugung von Rückwärtsreferenzen stets vermieden werden soll, wenn kein späterer Zugriff auf sie erfolge.

Denn die Erzeugung der Referenzen kostet Ausführungszeit und belegt Platz zur Speicherung der gefundenen Übereinstimmung.

Zudem lassen die Implementationen nur eine begrenzte Anzahl an Rückwärtsreferenzen zu (häufig nur maximal 9).

Beispiel

\d+(?:-\d+)*
  • Findet Folgen von durch Bindestriche getrennte Zahlenfolgen, ohne dabei die letzte durch einen Bindestrich getrennte Zahlenfolge als Rückreferenz zu erhalten.