JSON-Formatierer
JSON formatieren, prüfen und minifizieren, mit genauer Fehlerstelle.
Entwicklung
Muster live testen, mit Treffermarkierung und Gruppentabelle.
Das ist die deutsche Stolperfalle, und sie ist still: Muster funktionieren scheinbar, bis ein Umlaut auftaucht.
Die Zeichenklasse \w steht in JavaScript standardmäßig für [A-Za-z0-9_] — ohne ä, ö, ü und ß. Ein Muster wie ^\w+$ trifft „Meier", aber nicht „Müller". Ebenso findet [a-z]+ keine Umlaute.
Zwei Auswege. Der eine ist die ausdrückliche Erweiterung: [A-Za-zÄÖÜäöüß]. Der andere, sauberere ist der Unicode-Modus mit dem Schalter u und Eigenschaftsklassen: \p{L} für jeden Buchstaben in jeder Schrift, \p{Lu} für Großbuchstaben.
/^\p{L}+$/u trifft „Müller", „Ångström" und „Ćwiek" gleichermaßen — und ist damit die richtige Wahl für alles, was mit echten Namen zu tun hat.
Die Schalter ändern das Verhalten grundlegend und werden oft falsch kombiniert.
| Schalter | Wirkung |
|---|---|
| g | Findet alle Treffer statt nur den ersten |
| i | Ignoriert Groß- und Kleinschreibung |
| m | ^ und $ gelten je Zeile statt für den ganzen Text |
| s | Der Punkt trifft auch Zeilenumbrüche |
| u | Unicode-Modus, nötig für \p{...} und Zeichen außerhalb der BMP |
| y | Sucht nur genau ab der aktuellen Position |
Ein häufiges Missverständnis betrifft m und s: m ändert nur, wo ^ und $ greifen, nicht was der Punkt trifft. Wer über mehrere Zeilen hinweg suchen will, braucht s.
Quantoren sind standardmäßig gierig: .* nimmt so viel wie möglich und gibt nur zurück, soweit nötig. Mit angehängtem Fragezeichen werden sie genügsam und nehmen so wenig wie möglich.
Auf <b>fett</b> und <b>dick</b> trifft <b>.*</b> alles von der ersten bis zur letzten Marke. <b>.*?</b> trifft die beiden Abschnitte einzeln.
Gefährlich wird es bei verschachtelten Quantoren wie (a+)+b. Bei einer nicht passenden Eingabe probiert die Engine exponentiell viele Aufteilungen durch — bei dreißig Zeichen kann das Minuten dauern und den Tab einfrieren. Wer Muster aus Benutzereingaben zusammensetzt, öffnet damit eine Angriffsfläche.
Weil \w und [a-z] nur ASCII abdecken. Nimm den Schalter u und \p{L}, oder ergänze ÄÖÜäöüß ausdrücklich.
m lässt ^ und $ je Zeile greifen. s lässt den Punkt auch Zeilenumbrüche treffen. Zwei verschiedene Dinge.
Ein Quantor nimmt so viel wie möglich. Mit angehängtem ? wird er genügsam und nimmt so wenig wie möglich.
Weitgehend, aber nicht überall. Diese Engine ist die von JavaScript; Lookbehind und Eigenschaftsklassen verhalten sich anderswo teils anders.
Vermutlich katastrophales Backtracking durch verschachtelte Quantoren wie (a+)+. Vereinfache das Muster.
Nein, alles läuft in diesem Tab.