JavaScript/Objekte/RegExp/exec

Aus SELFHTML-Wiki
Wechseln zu: Navigation, Suche

Die Methode RegExp.exec() wendet einen regulären Ausdruck einmalig auf eine Zeichenkette an und gibt einen Array mit dem Treffer des Gesamtausdrucks sowie die Treffer der geklammerten Teilausdrücke zurück. Wenn der Ausdruck nicht auf die Zeichenkette passt, gibt die Methode null zurück.

Rückgabe-Array

Eine erfolgreiche Ausführung des regulären Ausdrucks liefert ein erweitertes Array zurück, das auf der Indexposition 0 die Zeichenkette enthält, die von der RegExp gefunden wurde. Wenn die RegExp Gruppierungsklammern enthält, werden die linken Klammern im Muster durchnummeriert (die erste linke Klammer bekommt die 1), und der Inhalt einer Klammergruppe wird an der Arrayposition hinterlegt, die der Nummer der zugehörigen linken Klammer entspricht. Die length-Eigenschaft des Arrays enthält die Anzahl der Gruppen im Muster, plus 1 für den Gesamttreffer.

Beachten Sie: Non-capturing groups (also (?:...)-Klammerungen) werden dabei nicht mitgezählt und erhalten auch keinen Arrayeintrag.

Das Array ist erweitert, weil es noch drei oder vier weitere Eigenschaften enthält:

index
enthält die Indexposition, an der im durchsuchten String der Gesamttreffer beginnt.
input
speichert die Zeichenkette, auf die die RegExp angewendet wurde
groups
enthält für jede benannte Gruppe aus dem Suchmuster eine gleichnamige Eigenschaft, in der sich der Inhalt dieser Gruppe befindet. Wird die RegExp ohne die Option d erzeugt, enthält die Eigenschaft die zur Gruppe gehörigen Zeichen. Mit der Option d enthält die Eigenschaft ein Array mit zwei Zahlen, das analog zu indices beschreibt, wo im durchsuchten String die Gruppe gefunden wurde.
indices
Nur vorhanden, wenn die RegExp mit der Option d erzeugt wurde. indices</code> ist ein Array, dessen Einträge wiederum Arrays aus 2 Werten sind. Der i-te Eintrag im indices-Array beschreibt für den i-ten Eintrag im Ergebnisarray, an welcher Position im durchsuchten String dieser Teil gefunden wurde, und vor welcher Position er endet.

Anwendungsbeispiele

Suchen eines Regulären Ausdrucks auf eine Zeichenkette

Beispiel ansehen …
  function analyseText () { 
    var text = document.querySelector('#lied').textContent,
        suchbegriff = /der (\w*)(.*)/,
        ergebnis = suchbegriff.exec(text);  
    for (var index = 1; index < ergebnis.length; index++) {
        document.querySelector('ol').innerHTML += '<li>' + ergebnis[index] + ' </li>';
    }
  }

Das Beispiel demonstriert die Anwendung eines regulären Ausdrucks auf eine Zeichenkette und den umfassenden Zugriff auf die Treffer und Teiltreffer. Zunächst wird ein regulärer Ausdruck mit dem Namen suchbegriff definiert. Er besteht aus dem festen Anfang der gefolgt von einer beliebigen Anzahl von alphanumerischen Zeichen bzw. oder Unterstrichen (\w*) . Danach kann eine beliebige Anzahl von beliebigen Zeichen folgen (.*). Um die Teilausdrücke \w* und .* sind jeweils Klammern notiert, sodass später deren Treffer ausgelesen werden können.

Mit dem Methoden-Aufruf suchbegriff.exec() wird der reguläre Ausdruck auf eine Zeichenkette angewandt. Als Parameter wird der Methode der zu durchsuchende Ausdruck übergeben. Die Methode gibt einen Array mit den Treffern zurück, der in der Variable ergebnis gespeichert wird.

Im Folgenden werden die Informationen aus dem Array ausgegeben. Das erste Element des Arrays (mit dem Index 0) ist der Treffer des Gesamtausdrucks. In den nachfolgenden Array-Elementen (mit dem Index 1 und darüber) sind die Teilstrings gespeichert, auf die die eingeklammerte Ausdrucksteile gepasst haben.

Das Beispiel durchläuft den Array mit einer for-Schleife und gibt auf diese Weise alle Teiltreffer aus. Zudem werden die beiden oben genannten, besonderen Objekteigenschaften des von exec() zurückgegebenen Arrays demonstriert: index und input die gewöhnliche Arrays nicht besitzen.

mehrfaches Anwenden von exec()

Dieses Beispiel veranschaulicht das mehrfache Anwenden von exec(), um alle möglichen Treffer eines Ausdrucks in Erfahrung zu bringen. Eine ähnliche Aufgabe ist zwar mit String.match() lösbar, aber match() erlaubt keinen Zugriff auf die jeweiligen Teiltreffer. Über RegExp.$1 und folgende Eigenschaften können lediglich die Teiltreffer des letzten Vorkommens gelesen werden. exec() hat diese Einschränkung nicht.

Beispiel ansehen …
  function analyseText () { 
    var text = document.querySelector('#lied').textContent,
        suchbegriff = /auf der (\w*)/gi,
        ergebnis;  
	while (ergebnis = suchbegriff.exec(text)) {
        document.querySelector('ol').innerHTML += '<li>' + ergebnis[1] + ' </li>';
     }
  }

Zunächst wird ein regulärer Ausdruck mit dem Zusatz /.../gi definiert. Die Angabe g stellt sicher, dass exec() mehrmals auf einen String angewendet werden kann und dadurch alle Vorkommen gefunden werden. Die Angabe i stellt sicher, dass die Groß- und Kleinschreibung bei der Suche keine Rolle spielt. Der Ausdruck passt auf den festen Text auf der gefolgt von einem Wort beliebiger Länge (\w*).

Damit exec() genau so oft ausgeführt wird, wie weitere Vorkommen gefunden werden, wird eine spezielle while-Schleife benutzt. Als Schleifenbedingung wird nicht wie üblich ein einfacher logischer Ausdruck (z. B. i > 5) notiert, sondern die Wertzuweisung ergebnis = suchbegriff.exec(text). – Dies ist möglich, da eine Wertzuweisung ebenfalls ein Ausdruck ist, wie z. B. window.alert(Variable = "Wert"); veranschaulicht. – Ihr Ergebnis gleicht dem des rechten Bestandteils suchbegriff.exec(text), also dem exec()-Aufruf. Dies ist entweder einen Array mit den Suchergebnissen, falls ein Vorkommen gefunden wurde, oder null, falls keine weiteren Vorkommen existieren. Als Ergebnis des Ausdrucks an der Stelle while (Ausdruck) { ... } wird entweder true oder false erwartet. Daher wandelt JavaScript das Ergebnis von suchbegriff.exec(text) entsprechend um. Ein Array gilt als true, sodass die Schleife im Erfolgsfalle fortgesetzt wird. Der Wert null gilt als false, sodass die Schleife abgebrochen wird, nachdem das letzte Vorkommen gefunden wurde.

Im Schleifenkörper wird der Array ergebnis verwendet. Dieser ist bei jedem Schleifendurchlauf neu gefüllt, da vor jedem Durchlauf die Schleifenbedingung ausgeführt wird – in diesem Fall der Aufruf von exec() und das Speichern des Rückgabewerts in der Variable ergebnis. Über Ergebnis[1] wird schließlich der Treffer des ersten Teilausdrucks ausgegeben.

Beachten Sie: Wie im Eingangsbeispiel illustriert, können Sie auf die Teiltreffer eines exec()-Aufrufs anstatt über den zurückgegebenen Array auch über RegExp.$1 und folgende Eigenschaften zugreifen. Diese Zugriffsweise wird allerdings seit der JavaScript-Version 1.5 als veraltet eingestuft und ist zumindest im Zusammenhang mit exec() auch praktisch unnötig.

Referenz