test und exec

Javascript Suchen und Ersetzen mit regulären Ausdrücken

Das RegExp-Objekt stellt test() und exec() für die Suche nach Strings mit regulären Ausdrücken bereit. Anders als die String-Methoden (match, search und indexOf) werden test und exec auf dem Suchmuster aufgerufen.

23-02-02 SITEMAP CSS HTML JS Basis JS Web Tutorial SVG

regex.test() und regex.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: regex.test () und regex.exec (). regex.test(text) ist die einfachste und schnellste Variante für die Suche nach einer Zeichenfolge.

Die Eigenschaften des RegExp-Objekts sind

  • RegExp.ingoreCase – Groß- Kleinschreibung ignorieren
  • RegExp.global – Über den gesamten String
  • RegExp.source – Enthält den Quelltext des regulären Ausdrucks
  • RegExp.lastIndex – Letzte Fundstelle

RegExp ist der Prototyp für reguläre Ausdrücke. Zwei Techniken stehen zur Konstruktion von regulären Ausdrücken zur Verfügung:

  1. die Deklaration als literaler Ausdruck
  2. 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");
const textline = "Der Pfad ist 'https://www.mediaevent.de/javascript/img/buffalo-mini.webp'";
const pattern = "/img/buffalo-mini.webp";

const regex = new RegExp ("/img/buffalo-mini.webp", "g");

console.log (regex.test(textline));

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.

String-Suche im Vergleich

Such-Methoden des Regex-Objekts.

Regex-SucheErgebnisKein Treffer
exec()Erste Position des Suchmustersnull
test()truefalse

Suche nach einer Zeichenkette in einem String – indexOf, search() und match()

Such-Methodemit Regex?ErgebnisKein Treffer
search()jaErste Position des Suchmusters, kann mit einem regulären Ausdruck suchen-1
indexOf / lastIndexOfneinErste Position des Suchbegriffs, kann ab einem bestimmten Index suchen-1
match()jaAlle Suchbegriffe als Arraynull