Suchen und Ersetzen mit regulären Ausdrücken: test und exec

Javascript Regex – Suchen und Ersetzen mit regulären Ausdrücken

Neben den String-Methoden für die Suche nach Mustern in Zeichenketten (match, search und indexOf) stellt das Regex-Objekt Methoden für die Suche zur Verfügung: test() und exec().

Suchen mit dem RegExp-Objekt funktioniert genauso wie mit der /regex/-Syntax – nur eben mehr objektorientiert und mit den gewohnten Hochkommas.

Das RegExp-Objekt hat zwei Methoden: RegExp.test () und RegExp.exec ()

Die Eigenschaften des RegExp-Objekts sind

RegExp ist der Prototyp für reguläre Ausdrücke. Zwei Techniken stehen zur Konstruktion von regulären Ausdrücken zur Verfügung: die Deklaration als literaler Ausdruck und der Aufruf der Konstrukturfunktion.

Literal

Jeder Javascript-Thread (ein Fenster) enthält ein vor-initialisiertes RegExp-Objekt. Die einfachste Technik, einen neuen regulären Ausdruck zu deklarieren, ist

let regex = /ab+c/gim;

Der Javascript-Interpreter übersetzt literale reguläre Ausdrücke, wenn das Script evaluiert wird. Wenn der reguläre Ausdruck konstant bleibt, ist das literale Regex schneller.

Konstruktor

Die Konstruktor-Funktion ist angebracht, wenn sich das Suchmuster des regulären Ausdrucks ändert, oder das Muster nicht bekannt ist (z.B. aus einem Eingabefeld stammt). Der Ausdruck wird zur Laufzeit ausgewertet.

let regex = new RegExp("ab+c");

Im zweiten optionalen Argument stehen die Modifier:

let regex = new RegExp ("ab+c", "g");

Wichtig: Die Konstruktorfunktion verwendet Hochkammas sowohl für den regulären Ausdruck als auch für die optionalen Modifier. Die eingrenzenden Schrägstriche entfallen und ein Schrägstrich muss nicht maskiert werden.

Das regExp-Objekt hat Speicherstellen und die Methoden regex.test und regex.exec. Dazu muss das reguläre Objekt aber nicht über new angelegt werden, sondern kann als einfache Variable definiert werden. Die Variable besitzt trotzdem die Funktionalität des Objekts.

String suchen mit exec(str)

Bei der Suche nach einem Muster (Pattern) führt Javascript exec(str) einen regulären Ausdruck auf dem String str aus und gibt ein Array mit dem Treffer und den Treffern bei den Unterausdrücken / Gruppen in runden Klammern zurück. exec() gibt null zurück, wenn es keinen Treffer gibt.

Bei einem Treffer gibt exec(str) zudem Informationen zu den Treffern (wurden g, i oder m-Modifier (auch als Flags bezeichnet) benutzt, Zeichenposition des Treffers)

Das entspricht der String-Methode match() ohne g-Modifier.

Regulärer Ausdruck
Modifier
String

let regexp = new RegExp (regex, modifier);
let matches = regexp.exec(searchstr);
if (matches === null) {
    document.getElementById('finder').innerHTML = "Kein Treffer";
} else {
    matches.forEach(listArray);
}

Wenn der g-Modifier für den regulären Ausdruck gesetzt ist, durchsucht exec() den String ab der Position, die durch den Wert von lastIndex angegeben wurde. Wenn g nicht gesetzt ist, ignoriert exec() den Wert von lastIndex und durchsucht die Zeichenfolge ab ihrem Anfang.

Wenn nur ein einfacher Test durchgeführt werden soll, ob der Ausdruck in einem String vorkommt, ist die test() schneller als exec().

Gesamten String mit exec durchsuchen

Genauso wie die String-Methode search () gibt exec () nur den ersten Treffer zurück. Um alle Vorkommen eines Suchmusters mit exec() zu finden, muss der String in einer Schleife durchlaufen werden.

01234567890123456789012345678901234567890123456789012345678901234
         |                                |                |
Haessler Häßler Gustav oder Haessler oder Hässler noch mal Heßler
indices 9,42,59
let regex = /H(ä|e)(ss|ß)ler/gi;
let result;
let indices = [];
let text = document.querySelector(".findall").innerHTML;
while (result = regex.exec(text)) {
   indices.push("" + result.index);
}
console.log ("indices " + indices);

String.match macht das automatisch, wenn das g-Flag gesetzt ist.

Vergleichen: test()

Javascript test() funktioniert im Grunde genommen genauso wie die Javascript String-Funktion search(). Aber während search() mit einem Suchmuster aufgerufen wird, funktioniert test() umgekehrt: Ein String wird in einen regulären Ausdruck geladen und geprüft, ob der String dem Muster des regulären Ausdrucks entspricht.

Javascript test() wird auf den String angewendet.

if (regEx.test(entryValue)) { 
   /* Gefunden! */ 
}

Treffer anzeigen mit Backreference

Das globale RegExp-Objekt beherbergt Informationen über den letzten erfolgreichen Teffer.

Aufrufe der Methoden exec() und test() ändern das globale RegExp-Objekt.

let myString = "[22].[44].[33].";
let myRegexp = /\d+/g, result;

while (result = myRegexp.exec(myString)) {
   console.log("lastIndex " + result, myRegexp.lastIndex);
};

Quelle: match Vs exec in JavaScript

[Log] lastIndex 22 – 3 (regex-regulaere-ausdruecke-3.html, line 688)
[Log] lastIndex 44 – 8 (regex-regulaere-ausdruecke-3.html, line 688)
[Log] lastIndex 33 – 13 (regex-regulaere-ausdruecke-3.html, line 688)

So könnte das Script nach einem erfolgreichen Treffer bei exec() anhand von lastIndex den String nach weiteren Treffern durchsuchen. Allerdings wäre die String-Methode match () mit einem /g-Modifier einfacher.

Entwickeln: compile()

gilt als veraltet und soll nicht mehr benutzt werden.

Früher wurde compile() benutzt, um ein neues Suchmuster einzusetzen:

let regexp = new RegExp("muster");
regexp.compile("neues muster");

Das ist aber nichts anderes als der Aufruf der Konstrukturfunktion (siehe oben):

let regexp = new RegExp("muster");
regexp = new RegExp("neues muster");

Wird also einfach nicht mehr gebraucht.

Javascript Regex – Suchen und Ersetzen mit regulären Ausdrücken