JavaScript: Was ist besser bei regulären Ausdrücken – Literal Notation oder über den Konstruktor?

Regex-Literal-Notation (/.../) und der new 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 mit new 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?

SituationVerwendeEmpfehlung
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 CodeLiteral oder CachingVorab 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.