SomeeLab.tools

Regex-Tester

Einen regulären Ausdruck am eigenen Text ausprobieren: jeder Treffer wird hervorgehoben, dazu die Fanggruppen und eine Vorschau der Ersetzung.

Was die vier Schalter tun

Ohne g wird nur der erste Treffer gefunden. Für das Zählen von Vorkommen oder das Ersetzen aller Stellen muss er an sein.

i ignoriert Groß- und Kleinschreibung. m lässt ^ und $ je Zeile greifen statt auf die ganze Zeichenkette, was beim Herausziehen von Zeilenanfängen aus einem Log gebraucht wird.

s erlaubt dem ., auch auf einen Zeilenumbruch zu passen. Standardmäßig überspringt der Punkt Umbrüche, ein über mehrere Zeilen verteilter Block braucht diesen Schalter also, um am Stück erfasst zu werden.

Bausteine, die sich zu merken lohnen

  • \d Ziffern, \w Buchstaben, Ziffern und Unterstrich, \s Leerraum. Großgeschrieben (\D \W \S) bedeuten sie das Gegenteil.
  • + eins oder mehr, * keins oder mehr, ? optional, {2,4} zwei- bis viermal.
  • ^ Anfang, $ Ende, \b Wortgrenze.
  • (...) fängt ein und taucht im Ergebnis auf, (?:...) gruppiert nur.
  • (?<name>...) benennt eine Gruppe, damit sie über den Namen statt über die Nummer gelesen werden kann.

Gierig gegen genügsam

.* läuft so weit es geht und weicht dann zurück. Auf <b>eins</b><b>zwei</b> angewandt verschluckt das Muster <b>.*</b> alles als einen einzigen Treffer.

Mit einem angehängten ? wird daraus <b>.*?</b>, das bei der ersten Gelegenheit stoppt und zwei Treffer liefert. Für alles zwischen Tags oder Anführungszeichen ist meist die genügsame Variante die richtige.

Warum das auf einem eigenen Thread läuft

Verschachtelte Quantoren können einen Ausdruck zum Explodieren bringen. Gibt man (a+)+b rund dreißig a mit, probiert die Maschine jede Aufteilung durch, und der Aufwand wächst um Größenordnungen. Eine winzige Eingabe beschäftigt sie minutenlang.

Dieses Werkzeug wertet das Muster auf einem eigenen Thread aus und beendet diesen nach einer Sekunde vollständig. Abbrechen lässt sich nichts, denn alles geschieht innerhalb eines einzigen Aufrufs. Deshalb bleibt die Seite bedienbar, auch wenn ein Ausdruck außer Kontrolle gerät.

Auf einem Server blockiert dasselbe Verhalten eine ganze Anfrage. Wenn Benutzereingaben im eigenen Code bis zu einem regulären Ausdruck durchreichen, sind verschachtelte Quantoren das Erste, wonach man sucht.

Die Schreibweise unterscheidet sich je nach Sprache

Hier läuft die JavaScript-Variante. Rückschau ((?<=...)) funktioniert in aktuellen Browsern, PCRE-eigene Möglichkeiten wie Rekursion oder atomare Gruppen gibt es dagegen nicht.

Python schreibt benannte Gruppen als (?P<name>...), und Java verlangt, die Backslashes im String noch einmal zu verdoppeln. Beim Übernehmen eines hier zurechtgelegten Musters die Schreibweise also anpassen.