Reguläre Ausdrücke (regular expressions) in JavaScript

In vielen Sprachen, so auch in JavaScript, gibt es sogenannte regular expressions(Reguläre Ausdrücke). Mit ihnen erstellen wir Suchmuster, mit denen wir dann Strings / Texte durchsuchen. Außerdem können damit auch Veränderungen am Text vorgenommen werden. Ich werde euch einen kleinen Einblick in diese Welt verschaffen.

Erstellt werden sie ganz normal wie andere Objekte / Variablen auch.

1 var reg = new RegExp('a+'); 2 var reg2 = /a+/;

Sieht nicht weiter kompliziert aus, oder? Kurz zum Verständnis: Das + heißt, dass das Muster dann passt, wenn das “a” mindestens einmal oder ganz oft hintereinander vorkommt. Der “/ /“ gibt an, dass das zu erstellende Objekt eine RegExp ist und kein anderes Objekt.

RegExp selbst besitzt zwei eigene Methoden. test und exec. Die Methode test liefert true oder false zurück. Je nachdem, ob unser Beispiel Satz das Muster enthält oder nicht.

1 <script> 2 var reg = /An/; 3 var satz = "Hallo an alle Leser."; 4 5 if(reg.test(satz)){ 6 document.writln("Treffer"); 7 }else{ 8 document.writln("Nicht gefunden"); 9 } //Ausgabe: Nicht gefunden 10 </script>

Es wird ein false zurückgegeben und das obwohl ein “an“ im Satz vorkommt. Jedoch ist der Ausdruck Case-Sensitive. Um das zu umgehen, muss der Ausdruck wie folgt lauten: /An/i

Das kleine “i“ hinter dem “/“ hebt es auf. Bei dem “i“ handelt es sich um eine Flag. Dazu gehören zum Beispiel noch “g“ und ”m“. Einmal suchen wir damit Global “g“(im gesamten String) und einmal auch Zeilenübergreifend “m“. Übergeben werden sie entweder an den Konstruktor, wenn wir new RegExp(‘Test‘ , i); nutzen oder hinter dem “/“ wie oben gesehen.

Schauen wir uns als nächstes exec an. Diese Methode speichert den gefundenen Part in einem Array. Findet es keine Übereinstimmungen, oder keine weiteren, erhält das Array einen NULL-Wert. Dazu auch ein kurzes Beispiel:

1 <script> 2 //Das "g" findet jedes Match und hört nicht nach dem ersten Treffer auf. 3 //Die Methode kann so mehrfach auf einen String angewendet werden und somit 4 //alle Vorkommen finden. 5 var regExp = /Kuchen/ig; 6 var text = "Wir hier bei der ppedv haben Kuchen." + 7 "Magst du auch kuchen? Wir alle mögen KuChen."; 8 9 var result = regExp.exec(text); 10 while(result){ 11 document.write(result[0] + "<br>"); 12 result = regExp.exec(text); 13 } 14 /* 15 Ausgabe: 16 Kuchen 17 kuchen 18 KuChen 19 */ 20 </script>

Mit dem Flag “g”, wird zusätzlich der letzte Index auf die Position gesetzt, bei der das letzte Muster beim Aufruf davor gefunden wurde. Somit findet jeder neue Aufruf der Methode ein neues Muster. Findet er keins mehr, so setzt er den Eintrag auf NULL und die Schleife bricht ab.

Als nächstes werfen wir noch einen kurzen Blick auf die regex-Methoden des String-Objekts. Davon gibt es diese Kandidaten: replace und search. Als erstes die replace-Funktion. Der Name verrät ja schon, was sie machen wird.

1 <script> 2 var reg = /\s\*/g; 3 var text = "Dies *ist *nur *ein *kleiner *Test"; 4 5 var result = text.replace(reg, '-'); 6 document.write(result); 7 //Ausgabe: Dies-ist-nur-ein-kleiner-Test 8 </script>

Wie wir sehen, ersetzt dieser reguläre Ausdruck zusammen mit der Methode die Sterne und Leerzeichen durch Bindestriche. Schauen wir uns die Expression trotzdem mal etwas näher an. Das “\s” steht hier für die Suche nach einem Leerraum (Leerzeichen, Tabulator). Gefolgt wird der Leerraum von einem “*”. Und es wird global gesucht. Der “\” hat hier gleich zwei Funktionen: Als erstes macht er aus einem Zeichen, das als “gewöhnlich” interpretiert wird (Wie zum Beispiel der Buchstabe “S” als Buchstabe), ein besonderes Zeichen (Suche nach Leerraum “\s”). Das Sternchen hingegen ist schon ein “besonderes” Zeichen. Es steht eigentlich dafür, dass das voranstehende Zeichen null oder beliebig oft hintereinander vorkommen darf und damit als gefunden gilt (/ppedv*/ würde also “pped”, “ppedv”, “ppedvv..” usw. finden). Durch den Backslash wird es zum “gewöhnlichen” Zeichen und somit als Sternchen im Text gefunden.

Wenn wir schon dabei sind, werfen wir doch gleich einen Blick auf ein paar “besondere Zeichen”, welche sich auf das vorangegangene Zeichen beziehen:

1 var reg1 = /ppedv+/; //findet ppedv, ppedvv... (1 oder beliebig) 2 var reg2 = /ppedv*/; //findet pped, ppedv, ppedvv... (0 oder beliebig) 3 var reg3 = /ppedv?/; //findet pped und ppedv (0 oder 1)

Nun fehlt noch die search-Methode. Wir suchen ja schon die ganze Zeit im Text was macht denn nun diese extra Funktion? Das ist schnell erklärt:

1 <script> 2 var text = "Wir sind die Ppedv AG. Wir sind ein lustiger Haufen. ppedv"; 3 var reg = /ppedv/i; 4 document.write(text.search(reg)); //Ausgabe 13 5 6 //Alternativ 7 var text = "Wir sind die Ppedv AG. Wir sind ein lustiger Haufen. ppedv"; 8 document.write(text.search("ppedv")); //Ausgabe 53 9 </script>

Wir bekommen die Position des Matches ausgegeben. Zählen wir nach.. das erste “P” beginnt bei Index[13]. Stimmt also. Die Alternative macht das Selbe. Wir übergeben der search-Methode keine regular expression, sondern eine Zeichenkette. Aber einen Unterschied erkennen wir trotzdem: die Ausgabe ist dort 53. Die Methode wandelt den String selber in eine Expression um, jedoch haben wir case-sensitive noch aktiv. Deswegen wird erst das zweite “ppedv” gefunden. Wollen wir ohne case-sensitive suchen, müssen wir die erste Variante benutzen. Übrigens können wir auch der replace-Methode einen String anstelle eines regulären Ausdrucks übergeben und diesen ersetzen lassen.

An der Stelle erst mal genug von regulären Ausdrücken. Es geht noch einiges mehr. Wir können Strings vertauschen, komplizierte Ausdrücke erstellen und uns Substrings anschauen. Doch das in einem späteren Teil.

 

Kommentare sind geschlossen