JavaScript: Was ist besser bei regulären Ausdrücken – Literal Notation oder über den Konstruktor?
Regex-Literal-Notation (
/.../
) und dernew RegExp(...)
-Konstruktor sind zwei verschiedene Wege, ein RegExp-Objekt zu erstellen – aber sie sind nicht kombinierbar.Reguläre Ausdrücke mit
/pattern/
(Literal-Notation) werden schon beim Parsen (Evaluieren) des Codes kompiliert.
Reguläre Ausdrücke mitnew RegExp('pattern')
werden erst zur Laufzeit kompiliert.
🔍 Unterschiede im Detail
1. Literal-Notation (/ab+c/
)
const regex = /ab+c/;
- Wird beim Parsen des Codes einmalig kompiliert.
- Schnell und effizient.
- Geeignet für feste, bekannte Muster.
- ✅ Besser für statische RegExes.
2. Konstruktor (new RegExp('ab+c')
)
const regex = new RegExp('ab+c');
- Wird bei jeder Ausführung neu kompiliert, wenn im Code so geschrieben.
- Muss zur Laufzeit aus einem String gebaut werden.
- Nötig, wenn du dynamische Muster zusammenstellst.
- ⚠️ Etwas langsamer als Literal-Notation – meist aber vernachlässigbar.
🔴 Das geht NICHT:
new RegExp(/^[0-9]{1,3}X? \p{L}+/iu); // ❌ Falsch!
→ Das erzeugt nicht korrekt das erwartete Regex-Objekt, sondern konvertiert das Literal in einen String, verliert evtl. Flags und Unicode-Semantik.
🧠 Wann was verwenden?
Situation | Verwende | Empfehlung |
---|---|---|
Fester Ausdruck (/abc/ )Konstanter Regex im Code | Literal (/abc/ ) | ✅ Bevorzugen |
Dynamischer Ausdruck ('abc' )Regex wird zur Laufzeit erzeugt | new RegExp(str) | ✅ Einzige Option |
In Schleifen / häufiger Code | Literal oder Caching | ✅ Vorab kompilieren und wiederverwenden |
Regex-Literal in new RegExp(...) | ❌ Nicht möglich |
🏁 Performance?
- Die Literal-Variante ist etwas schneller, weil sie nur einmal kompiliert wird.
- Aber: Der Unterschied ist nur messbar in Hot-Code (z. B. tausende RegEx-Aufrufe pro Sekunde).
- Viel wichtiger ist die Lesbarkeit und Flexibilität.
✅ TL;DR
- Verwende
/regex/
für feste Muster (schneller, einfacher, lesbarer). - Verwende
new RegExp(string)
, wenn du das Muster dynamisch zur Laufzeit erzeugst. - Wenn Performance kritisch ist: nicht bei jedem Aufruf
new RegExp(...)
neu erstellen, sondern vorher bauen und wiederverwenden.