fboës - Der Blog

Backreferences in regulären Ausdrücken

Niemand auf diesem Planeten wird jemals ernsthaft behaupten, ein Meister der regulären Ausdrücke zu sein. Selbst nach jahrelangem Einsatz findet man immer wieder neue Techniken. Meine jüngste Erkenntnis: Backreferences in regulären Ausdrücken.

Im Blogophon (der Blog-Software zu dieser Seite) gibt es eine größere Bibliothek, die HTML in noch viel schöneres HTML verwandeln soll. Dazu wiederum werden Unmengen an regulären Ausdrücken verwendet.

Ein spezieller Ausdruck ist dafür zuständig, alle Vorkommen von „…“ und ‚…‘ in ein <kbd>-Tag einzuwickeln. Der erste Versuch sah wie folgt aus:

.replace(/(&quot;|&#39;|')(.*?)(&quot;|&#39;|')/g, '<kbd>$0</kbd>')

Dummerweise ist der Ausdruck falsch, denn so findet er auch „…‚ und ‘…“. Die Lösung für dieses Dilemma sind dann separate Ersetzungen:

.replace(/(&quot;)(.*?)(&quot;)/g, '<kbd>$0</kbd>')
.replace(/(&#39;)(.*?)(&#39;)/g, '<kbd>$0</kbd>')
.replace(/(')(.*?)(')/g, '<kbd>$0</kbd>')

Wie man unschwer erkennt, ist das ein deutlicher Verstoß gegen das DRY-Prinzip, aber augenscheinlich notwendig, um eine Ersetzung nur durchzuführen, wenn Anfangs- und Endzeichen identisch sind.

Lesen bildet: Backreferences

Beim Lesen des Buches „Secrets of the Javascript Ninja“ von John Resig, Bear Bibeault und Josip Maras bin ich neben vielen anderen erhellenden Kapiteln auch auf das Kapitel über reguläre Ausdrücke gestoßen. Und hier werden im Nebensatz Backreferences erläutert.

Mit einer Backreference kann man exakt den Inhalt einer einmal in einem regulären Ausdruck gefundenen Gruppe nochmals finden. Um z.B. den Inhalt von Gruppe 1 nochmal zu finden, verwendet man \1, von Gruppe zwei dementsprechend \2.

Das obige Beispiel ist damit korrekt:

.replace(/(&quot;|&#39;|')(.*?)(\1)/g, '<kbd>$0</kbd>')