Thiemos Archiv
- Monday, 2011-06-06 18:21
- Mich hat interessiert, ob sich die Webbrowser in ihrer Unterstützung für reguläre Ausdrücke unterscheiden. Werden bestimmte, erweiterte Regex-Suchmuster von manchen älteren Webbrowsern möglicherweise nicht verstanden? Die kurze Antwort lautet: Nein. Die Regex-Engines aller Webbrowser, auch der älteren, scheinen in puncto Funktionsumfang sehr konsistent zu sein.
Zur Erhebung meiner Daten habe ich ein kleines Script auf einer meiner Websites platziert, das die Webbrowser der Besucher für ein paar Mini-Tests missbraucht und für jeden regulären Ausdruck protokolliert, ob er erfolgreich war oder nicht oder gar eine Exception auslöste. In der Auswertung tauchen unter anderem Internet Explorer ab Version 6 auf, Firefox ab Version 2, Safari ab Version 3.1, Google Chrome ab Version 3 und (natürlich) Opera ab Version 10.
Meine Ergebnisse:
- Nicht-matchende Klammerausdrücke (non matching parenthesis) werden von allen Webbrowsern verstanden. Zum Beispiel bedeutet
(?:a)(b)
, dass der Inhalt der zweiten Klammer wieder als$1
in der Ersetzung verwendet werden kann. Die erste Klammer wird durch den Vorsatz?:
davon ausgeschlossen. - Die Kurzformen
\s
(spaces) und\w
(words) für Zeichenklassen (character class) werden von allen Webbrowsern verstanden. Noch nicht getestet habe ich allerdings, ob alle Browser die selben Zeichen (Zeilenumbrüche, Umlaute) als zu diesen Klassen zugehörig betrachten. - Lookaheads wie zum Beispiel
a(?=b)
und sogar negative Lookaheads wiea(?!b)
werden überraschenderweise von allen Webbrowsern verstanden, selbst von den ältesten in meiner Erhebung. - Nicht unterstützt werden Lookbehinds wie
(?<=c)b
sowie Inline-Modifikatoren wie(?i)
. Nur Konqueror fällt aus dem Rahmen, dort funktioniert beides.
Ein interessantes Detail am Rande: Der Googlebot hat an meiner Erhebung teilgenommen und brav das JavaScript mit seinen regulären Ausdrücken ausgeführt. Merkwürdigerweise sind die Fehlermeldungen, die er für die letzten beiden Tests ausspuckt, nicht identisch zu den Meldungen vom Chrome-Browser sondern zu denen vom Safari. Vielleicht hat aber auch nur jemand die Signatur seines Safaris kreativ maskiert.
- Nicht-matchende Klammerausdrücke (non matching parenthesis) werden von allen Webbrowsern verstanden. Zum Beispiel bedeutet
Kommentare zu diesem Beitrag können per E-Mail an den Autor gesandt werden.
Zeichenklassen in Zeichenklassen wie z.B. [^\d] funktionieren in allen Webbrowsern bis hinunter zu IE6, egal mit welchem Kürzel und egal was man sonst noch in die eckigen Klammern packt.
Ein Bindestrich am Ende einer Zeichenklasse wie [^1-] (Zeichenklasse mit allen Zeichen außer der Eins und dem Bindestrich) wird einheitlich als Bindestrich interpretiert und nicht als Zeichenbereich. Der besseren Lesbarkeit wegen sollte man trotzdem [^1\-] schreiben, genauso wie man [^\[] schreiben sollte und nicht [^[]. Werkzeuge wie JSLint fordern das auch ganz zu Recht.
Optionale Teilausdrücke wie in /a|b/ funktionieren auch ohne runde Klammern in allen Webbrowsern.
Selbstreferenzen wie in (.)\1 (finde ein beliebiges Zeichen gefolgt vom gleichen Zeichen) funktionieren ebenfalls in allen Webbrowsern.