Javascript Regex Backreference

Reguläre Ausdrücke: Rückverweise oder Backreference

Runde Klammern in Regex – regulären Ausdrücken – bilden Gruppen und sind der Speicher oder das Gedächtnis für bereits gefundene Teilstrings: Das ist der Rückverweise oder Backreferenz des regulären Ausdrucks.

Regex-Gruppen

Beide reguläre Ausdrücke finden dieselbe Folge von Ziffern, aber der zweite Ausdruck kann später durch eine besondere Variable für ein Backreference (Rückverweis) aus dem Gedächtnis geholt und mit $Num angesprochen werden:

/\d+/
/(\d+)/

Gruppen in runden Klammern werden z.B. für ein "oder" eingesetzt: Suche ä oder ae: /(ä|ae)/.

Außerhalb des regulären Ausdrucks – z.B. im Ersetzungsteil – wird die besondere Variable durch $1 für die erste runde Klammer, $2 für die zweite, … bis $99 verwendet.

Diese Namenskonvention für Variablen – $ – hat Javascript aus Perl genommen (PHP-Programmierer kennen diese Schreibweise für Variablennamen ebenfalls).

Strings tauschen

Mit Backreferences oder Rückverweisen kann ein regulärer Ausdruck Strings tauschen (swap).

Sie pflanzten Rosen und diverse Bäume.

var br = document.querySelector(".br").innerHTML;
var result = br.replace(/(Rosen)(.*)(Bäume)/,"$3 $2 $1");
document.querySelector(".br").innerHTML = result;
     $1    $2    $3
     |     |     |
(/(Rosen)(.*)(Bäume)/,"$3 $2 $1")

Die Gruppe (.*) – $2 – steht für "alles Mögliche dazwischen".

Backreference mit regex.exec ()

Die Notation $Num ist so intuitiv wie ein Lochstrickmuster. Zuweisung mit rexeg.exec (str) ist besser lesbar (um einen Hauch, aber immerhin).

ISO-Datum in normaler Schreibweise
function parseIsoDate(str) {
    let matchObj = /^([0-9]{4})-([0-9]{2})-([0-9]{2})$/.exec(str);

    if (!matchObj) {
        throw new Error('Kein valides ISO-Datum: ' + str );
    }
    
    return matchObj[3] + "." + matchObj[2] + "." + matchObj[1];
}

Named capturing groups sollen in Zukunft die Lesbarkeit der Fragmente verbessern. Gibt es aktuell als babelio.js-Plugin von DmitrySoshnikov.

Alle Treffer einer Suche markieren

string match und string replace funktionieren mit regulären Ausdrücken, aber string text nur mit einer Zeichenkette.

Die Zeichenkette string soll immer in ein mark-Tag eingeschlossen werden. Typische Anwendung: Wenn der Suchbegriff in der Liste der Treffer markiert werden soll.

let str = document.querySelector("#replace").innerHTML.replace(/(string)/ig,"<mark> $1 </mark>");
document.querySelector("#result").innerHTML = str; 

Gefunden auf Stackoverflow

Würde auch mit $& anstelle von $1 funktionieren, da hier nur auf eine Gruppe verwiesen wird.

\.* $ (ops) \w+ [a-z] (!*fl) 31292725232119171513119753116151413121110987654321 Square in a Diamond Lace Knitting Stitch