Reguläre Ausdrücke - Tutorial Teil 6: Wiederverwendung und Rückwärtsreferenzen

 

0 Kommentare | Kommentar schreiben | Bewerten | Artikel melden

 

Typ

Tutorial für Anfänger

Kategorie

Tools & Nützliches

Sprache

Deutsch

Autor

Stefan Trost Media

Eintrag

13.07.2011

Bewertungen

101

Views

4723
 
 


Über den Autor

Stefan Trost ist Entwickler von Software und Weblösungen und kümmert sich auch gerne um Ihre individuellen Softwarewünsche oder Webauftritte. Kontakt

Profil von Stefan Trost Media
Artikel von Stefan Trost Media

Die Möglichkeiten, die Sie durch reguläre Ausdrücke haben, sind weit aus komplexer als bis jetzt beschrieben. In diesem Teil kümmern wir uns um die Wiederverwendung von gefundenen Bestandteilen von Zeichenketten und Rückwärtsreferenzen. Bis jetzt sind folgende Teile dieses Tutorials erschienen:

Teil 1: Einführung und Grundlagen | Teil 2: Einfache Zeichenketten, Wiederholungen und Gruppieren | Teil 3: Metazeichen | Teil 4: Zeichenauswahl und alternative Zeichen | Teil 5: Zeichengruppen und Klassen | Teil 6: Wiederverwendung und Rückwärtsreferenzen | Teil 7: Modifikatoren | Teil 8: Anwendung und Beispiele

Wichtiger Hinweis

Um die Beispiele ausprobieren zu können und um selber reguläre Ausdrücke zu testen, können Sie die Software Text Konverter in der Basic Version benutzen. Im ersten Teil des Tutorials ist erklärt, wie dies funktioniert.

Wiederverwendung von gefundenen Zeichen

Bislang haben wir uns nur reguläre Ausdrücke im "Suchen"-Feld des Text Konverters angesehen. Das heißt, wir haben nach einer Zeichenkette mit einem regulären Ausdruck gesucht und das gefundene dann durch eine andere feststehende Zeichenkette ersetzt. Wir können aber auch Teile der gefundenen Zeichenkette im "Ersetzen"-Feld wiederverwenden. Was damit möglich ist, erfahren wir in den folgenden Beispielen.

Beispiel 1

Suchen nach:     Ersetzung:   Original:         Nach Ersetzung:

(.*)             $1           abc               abc

(.*)c            $1           abc               ab

(.*c)            $1           abc               abc

Zunächst müssen wir eine Referenz aufbauen. Das geht mit einer Klammer um den Teil der gefundenen Zeichenkette, der wiederverwendet werden soll. Das einfachste Beispiel sehen Sie in Zeile 1 des Beispiel 1. Wir suchen mit .* alle Zeichen. Mit der Klammer um .* erreichen wir, dass wir die gefundenen Zeichen wiederverwenden können. Indem wir in die Ersetzung $1 hineinschreiben, können wir den gefundenen Text wiederverwenden. $1 steht für den Inhalt, der in der ersten Klammer gefunden wurde. Demnach wird der Text "abc" komplett gefunden und anschließend wieder mit "abc" ersetzt. Es hat sich am Original nichts geändert.

In der zweiten Zeile suchen wir beliebige Zeichen vor einem c. Das beliebige Zeichen ist in einer Klammer eingefasst, deren Inhalt wir mit $1 wieder einfügen möchten. Das "c" geht dabei verloren, da dieses nicht in der Klammer steht. Gefunden wird zwar "abc", eingefügt aber nur noch "ab". Anders ist es in der nächsten Zeile. Hier steht "c" auch innerhalb der Klammer. Wieder wird "abc" gefunden und durch den Klammerinhalt ersetzt. Also ergibt sich in diesem Beispiel wieder keine Änderung am Originaltext.

Beispiel 2

Suchen nach:    Ersetzung:   Original:         Nach Ersetzung:

(.*)x(.*)       $2x$1        axc               cxa

Im ersten Kasten haben wir mit $1 immer die Referenz aus der ersten Klammer geholt, die erschien. Wenn wir mehrere Klammern verwenden, können wir mit $1, $2, $3 und so weiter den Inhalt einer beliebigen Klammer aufrufen. Wir suchen in Beispiel 2 beliebige Zeichen vor einem x und beliebige Zeichen nach einem x. Im Original trifft dies auf "axc" zu, diese Zeichenkette wird also gefunden. Ersetzt wird diese Zeichenkette mit $2x$1. Das bedeutet: Wir nehmen erst den Inhalt aus der zweiten Klammer, dann ein "x" und schließlich den Inhalt aus der ersten Klammer. Es ergibt sich "cxa", wir haben "a" und "c" um das "x" herum ausgetauscht.

Beispiel: Amerikanisches Datum umschreiben

Beispiel 3

Suchen nach:         (\d{4})/(\d{2})/(\d{2})

Ersetzen durch:      $3.$2.$1

Original:            2011/07/13

Nach Ersetzung:      13.07.2011

Wir möchten uns nun ein Beispel ansehen, wo wir dieses Wissen in der Praxis anwenden können. Wir möchten ein amerikanisches Datum in der Form 2011/07/13 in ein Datum der Form 13.07.2011 umformen. Dazu schreiben wir den regulären Ausdruck, den Sie in Beispiel 3 sehen: \d steht für eine Ziffer (siehe vorheriger Teil). Wir haben drei Gruppen aus Ziffern, deren Länge zuerst 4, dann 2 und dann 2 Stellen betragen soll. Diese Zifferngruppen sind durch das Zeichen / getrennt. Dieses Zeichen ist kein Metazeichen so dass wir es direkt nutzen können. Das beschreibt die Form unseres amerikanischen Datums. Die Ziffernblöcke haben wir mit Klammern versehen, wodurch wir sie mit $1, $2 und $3 wiederverwenden können. Das machen wir dann auch, ordnen die Blöcke in der richtigen Reihenfolge an und schreiben Punkte dazwischen. Schon ist unser Datum richtig formatiert.

Rückwärtsreferenzen

Wir erinnern uns an den Ausdruck [ab]+ aus einem vorherigen Teil. Dieser passte auf Zeichenketten wie "aaaa", "bb" aber auch "abbaa" oder "ababaa". [ab]+ sagt nur aus, dass sich ein Element aus der Gruppe [ab] einmal oder mehrfach wiederholen muss. Welches Element dieser Gruppe dies ist, wird nicht näher spezifiert. Es kann immer das gleiche Element sein oder immer ein anderes.

Beispiel 4

Suchen nach:  Ersetzung:   Original:           Nach Ersetzung:

[ab]+         X            abab aaaa bb aabb   X X X X

([ab])\1+     X            abab aaaa bb aabb   XXXX X X XX

Wenn sich aber tatsächlich nur ein Element aus der Gruppe wiederholen soll, können Sie Rückwärtsreferenzen benutzen. Rückwärtsreferenzen ähneln der Wiederverwendung von gefundenen Zeichen, die wir weiter oben besprochen haben. Der Unterschied ist aber, dass wir nun innerhalb eines Ausdrucks die Zeichen referenzieren und nicht vom "Suchen"- in das "Ersetzen"-Feld.

Das Beispiel zeigt, wie wir solch eine Referenz anlegen können. Zunächst haben wir eine Zeichengruppe [ab]. Diese fassen wir wieder mit runden Klammern zusammen, um Bezug darauf zu nehmen. Da dies die erste Klammer ist, die wir verwenden, handelt es sich um die Referenz 1. Wähend wir über die Felder hinweg $1 schreiben mussten, benutzen wir innerhalb eines regulären Ausdrucke \1 um die Referenz zu kennzeichnen. Hinter \1 erscheint ein +. Das bedeutet, dass die Referenz sich einmal oder mehrfach wiederholen muss.

Der Ausdruck bedeutet also folgendes: Die Referenz \1 soll sich einmal oder mehrfach wiederholen. Die Referenz \1 zeigt auf die erste Klammer. Die erste Klammer beinhaltet die Zeichenauswahl a oder b. Also muss sich entweder a oder b einmal oder mehrfach wiederholen. Und so ist es auch. Der Ausdruck findet "aaaa", "aa", "bbb", "b" aber nicht "aab" oder "baba". Im Beispiel wird also "abab" als vier einzelne Vorkommnisse angesehen und durch "XXXX" ersetzt, während "aaaa" zu "X" wird, da sich hier ein Buchstabe wiederholt.

Mehrfache Verwendung einer Rückwärtsreferenz

Beispiel 5

Suchen nach:    Ersetzung:   Original:           Nach Ersetzung:

([ab])x\1x\1    X            axaxa abab bxbxb    X abab X

Auch das mehrfache verwenden einer Rückwärtsreferenz ist möglich. Ein Beispiel sehen Sie im Kasten. Hier soll unsere Zeichenkette mit einem Buchstaben aus der Gruppe [ab] beginnen. Diese Gruppe haben wir mit einer Klammer zur Referenz \1 zusammen gefasst. Nach einem Zeichen aus der Gruppe soll ein "x" kommen und anschließend eine Referenz auf die Gruppe - also wieder ein "a" oder ein "b", je nachdem was in der ersten Gruppe gefunden wurde. Dann kommt wieder ein "x" und anschließend noch einmal das Zeichen aus der ersten Gruppe. Dieser Ausdruck trifft daher auf "axaxa" und "bxbxbx" zu, aber nicht auf andere Kombinationen wie zum Beispiel "abab".

Mehrere Rückwärtsreferenzen

Beispiel 6

Suchen nach:        Ersetzung: Original:           Nach Ersetzung:

([ab])x([cd])x\1\2  X          axdxad ab bxdxbd    X ab X

([ab])x([cd])x\2    X          axcxc ab bxcxc      X ab X

In den ersten Beispielen haben wir immer nur eine Rückwärtsreferenz mit \1 angesprochen. Wenn Sie mehrere Klammern verwenden, entstehen mehrere Referenzen. Ein Beispiel sehen Sie im Kasten. Hier möchten wir ein Zeichen aus der Gruppe [ab], dann soll ein "x" kommen, dann ein Zeichen aus der Gruppe [cd] und dann wieder ein "x". Zuletzt soll sich das Zeichen aus der ersten Gruppe und das Zeichen aus der letzten Gruppe wiederholen. Wir haben damit zwei Rückwärtsreferenzen definiert. Gefunden wird beispielsweise "axdxad", "bxdxbd" aus dem Beispiel aber auch "axcxcd" oder "bxcxbc" würden durch diesen Ausdruck gefunden werden.

Wir sind nicht gezwungen jede von mehreren Rückwärtsreferenzen auch zu benutzen. In der zweiten Zeile definieren wir zwar eine Referenz auf die Gruppe [ab] wir benutzen \1 aber nicht und benutzen stattdesen nur die Referenz auf die zweite Gruppe mit \2. Manchmal benötigt man nämlich Klammern um bestimmte Gruppen zusammenzufassen, die man aber nicht als Referenzen wiederverwenden möchte.

Zusammenfassung

  • Zeichen die Sie wiederbenutzen wollen beziehungsweise Zeichen auf die eine Referenz zurückgreifen soll, sind in Klammern eingefasst
  • Die Referenzen sind durchnummeriert und beginnen bei der ersten Klammer mit 1
  • Wenn Sie Referenzen über mehrere reguläre Ausdrücke vornehmen wollen (zum Beispiel beim Suchen und Ersetzen), referenzieren Sie mit $1, $2, $3 und so weiter
  • Auch Referenzen innerhalb eines regulären Ausdrucks sind möglich. Hier benutzen Sie \1, \2, \3 und so weiter.

Lesen Sie weiter

 

© Stefan Trost - Die Verwendung dieses Tutorials, auch in Auszügen, ist nur nach vorheriger Genehmigung von Stefan Trost erlaubt. Sie können das Tutorial aber gerne verlinken.

 
  
 

Kommentare

Sind Sie der selben Meinung wie der Autor oder wollen Sie etwas ergänzen? Hier können Sie einen Kommentar hinterlassen.

Kommentar schreiben

Sie können zu diesem Artikel einen anonymen Kommentar hinterlassen. Möchten Sie unter Ihrem Namen schreiben, loggen Sie sich ein oder registrieren Sie sich.



Bisherige Kommentare

Zu diesem Artikel wurden bislang noch keine Kommentare abgegeben.