Über mich

Startseite arrow Tipps & Tricks arrow Reguläre Ausdrücke in JavaScript: Dot all Problem

Reguläre Ausdrücke in JavaScript: Dot all Problem

Donnerstag, 19. Februar 2009
Geschrieben von Armin Vieweg
Bei einem regulären Ausdruck (RegEx) können sogenannte Flags gesetzt werden. Einer davon heißt "Dot all" (/s) und funktioniert überall, außer in JavaScript. Es gibt aber einen Trick.

In JavaScript gibt es zwei relevante Befehle um mit Regulären Ausdrücken zu arbeiten. Match und Replace.



In beiden Befehlen wird ein Regulärer Ausdruck angegeben, der ohne Anführungszeichen notiert wird. Das sieht dann z.B. so aus:

variable = "Drei Chinesen mit dem Kontrabass, sitzen auf der Straße und erzählten sich was.";
r = variable.replace(/[aeiouäöü]/gi, "e");



Die Variable r hat dann den Wert: "Dree Chenesen met dem Kentrebess, setzen eef der Streße end erzehlten sech wes". Dies ist eben das klassische Prinzip, dieses Liedes ;)

In dem Replace-Befehl steht /[aeiouäöü]/gi ohne Anführungszeichen. Dies ist die einzige mir bekannte Anwendung bei der auf solche Anführungszeichen verzichtet wird. Benutzt man welche, erhält man einen Fehler. Lediglich bei der Ersetzung werden wieder Anführungszeichen verwendet, darin kann man dann auch mit $1, $2, etc. arbeiten, wenn man diese vorher im Regulären Ausdruck mit Klammern gesetzt hat.


Flags
Hinter den beiden Slashs (/), die den Anfang und das Ende des Ausdrucks darstellen, findet sich noch ein g und ein i. Dabei handelt es sich um so genannte Flags. Sie wirken sich auf den kompletten Ausdruck aus.

Das g steht z.B. für global und bedeutet, dass die Ersetzung im kompletten String durchgeführt wird. Würde man es weglassen, wird nur das erste Gefundene ersetzt.

Das i steht für ignoreCase und bedeutet, dass kein Unterschied zwischen Groß- und Kleinschreibung gemacht wird. Man kann das Flag "i" auch weglassen und im String alle Großbuchstaben separat angeben, macht in diesem Beispiel aber keinen Sinn.



Das Flag /s (dot all)
Als regelmäßiger Verwender von Regulären Ausdrücken braucht man dieses Flag häufiger. Es sagt, dass der Punkt (.) der für ein beliebiges Zeichen steht, auch Zeilenumbrüche beinhaltet. Das ist bei dem Punkt nämlich ansonsten nicht der Fall.

Das Problem bei diesem Flag ist nur, dass es zwar in PHP wunderbar funktioniert, jedoch nicht in JavaScript. Setzt man ein /s hinter seinen Ausdruck erhält man einen Fehler und das Script läuft nicht weiter.


Die Lösung
Man kann statt einem Punkt folgendes verwenden: [\S\s]
Ein \s steht für ein Whitespace-Zeichen. Also ein Tab (\t) ein Return-Zeichen (\r) oder eben auch ein Zeilenumbruch (\n) u.a.

Das große \S steht für kein Whitespace-Zeichen. Also genau das Gegenteil. Dadurch das man beide zusammenbringt hat deckt man alle verfügbaren Zeichen ab, die es gibt, inkl. dem Zeilenumbruch, der in einem Punkt (.) nicht enthalten wäre.

Quellcode-Technisch sieht das dann so aus:

PHP

$regex = "/ausdruck(.*)ausdruck/is";


entspricht

JavaScript

var regex = /ausdruck([\S\s]*)ausdruck/gi;





Zum Testen von JavaScript empfehle ich im Übrigen folgendes Tool:

Professor Web: Testprogramm für Reguläre Ausdrücke




  Kommentare (1)
 1 Geschrieben von: qwert, am 01.04.2010 um 21:55
/pattern/flags ist die literale Schreibweise für new RegExp("pattern","flags") so wie  
[] die literale Schreibweise für new Array() oder 
{} die literale Schreibweise für new Object() ist.
Letzte Aktualisierung ( Freitag, 15. April 2011 )
 
< Zurück   Weiter >