Start · Sprachen · JavaScript · Referenz · new RegExp()

new RegExp()

Methode

Der <code>RegExp()</code>-Konstruktor erzeugt ein neues <code>RegExp</code>-Objekt aus einem Muster-String oder einem bestehenden regulären Ausdruck, optional mit Flags.

seit JavaScript ES1 (Flags-Kopie aus RegExp-Objekt: ES2015; Flag „ Kategorie: method-property

Signatur

new RegExp(pattern, flags)

Beschreibung

Mit new RegExp() erzeugen Sie reguläre Ausdrücke zur Laufzeit. Anders als beim Literal /muster/flags, das beim Parsen des Skripts kompiliert wird, kann das Muster hier aus Variablen, Benutzereingaben oder Konfigurationsdaten zusammengesetzt werden. Das ist der typische Anwendungsfall: dynamische Suchbegriffe, konfigurierbare Validierungen oder das Kopieren eines vorhandenen Ausdrucks mit anderen Flags.

Als pattern kann ein String oder ein vorhandenes RegExp-Objekt übergeben werden. Bei einem RegExp-Objekt wird dessen Quelltext übernommen; werden zusätzlich flags angegeben, ersetzen diese die ursprünglichen Flags (seit ES2015). Wird RegExp() ohne new aufgerufen und ist pattern bereits ein RegExp ohne neue Flags, liefert der Aufruf dasselbe Objekt zurück statt einer Kopie.

Wichtig: Da das Muster ein gewöhnlicher String ist, müssen Backslashes doppelt maskiert werden – /\d+/ entspricht new RegExp("\\d+"). Ebenso müssen Sonderzeichen aus Benutzereingaben (. * + ? ^ $ { } ( ) | [ ] \) escaped werden, wenn sie wörtlich gesucht werden sollen.

Gültige Flags sind d (Indizes), g (global), i (Groß-/Kleinschreibung ignorieren), m (mehrzeilig), s (dotAll), u (Unicode), v (Unicode-Sets) und y (sticky). Ungültige oder doppelte Flags sowie syntaktisch fehlerhafte Muster lösen einen SyntaxError aus.

Parameter

Name Typ Default Beschreibung
$pattern Pflicht string | RegExp "(?:)" Der Quelltext des regulären Ausdrucks als String (ohne umschließende Schrägstriche) oder ein vorhandenes RegExp-Objekt, dessen Muster übernommen wird. Fehlt der Wert, entsteht ein leerer Ausdruck, der auf alles passt.
$flags string Beliebige Kombination aus d, g, i, m, s, u, v, y. Bei einem RegExp als pattern ersetzen sie dessen Flags vollständig. u und v dürfen nicht kombiniert werden.

Rückgabewert

Typ
RegExp
Beschreibung
Ein neues RegExp-Objekt mit dem angegebenen Muster und den Flags; lastIndex ist auf 0 gesetzt.

Beispiele

Dynamische Suche mit Benutzereingabe (sicher escaped)

// Sonderzeichen maskieren, damit sie wörtlich gesucht werden
const escapeRegExp = (str) => str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');

const suchbegriff = 'c++';
const text = 'Ich lerne C++ und c++ macht Spaß.';

const re = new RegExp(escapeRegExp(suchbegriff), 'gi');
console.log(text.match(re));
console.log(re.source);
[ 'C++', 'c++' ] c\+\+

Backslashes im String doppelt maskieren

const literal = /\d{4}-\d{2}-\d{2}/;
const dynamisch = new RegExp('\\d{4}-\\d{2}-\\d{2}');

console.log(literal.source === dynamisch.source);
console.log(dynamisch.test('Termin am 2024-05-17'));

// Alternative: String.raw erspart das Verdoppeln
const mitRaw = new RegExp(String.raw`\d{4}-\d{2}-\d{2}`);
console.log(mitRaw.test('2024-05-17'));
true true true

Vorhandenen Ausdruck mit anderen Flags kopieren

const basis = /fehler/i;
const global = new RegExp(basis, 'gi');

const log = 'Fehler in Zeile 3, fehler in Zeile 9';
console.log(global.flags);
console.log(log.replaceAll(global, 'WARNUNG'));
console.log(basis === global);
gi WARNUNG in Zeile 3, WARNUNG in Zeile 9 false

Ungültige Muster abfangen

const erstelleRegex = (muster, flags = '') => {
  try {
    return new RegExp(muster, flags);
  } catch (err) {
    console.error(`${err.name}: ${err.message}`);
    return null;
  }
};

console.log(erstelleRegex('[a-z'));
console.log(erstelleRegex('abc', 'gg'));
console.log(erstelleRegex('^\\w+$', 'u')?.test('Hallo'));
SyntaxError: Invalid regular expression: /[a-z/: Unterminated character class null SyntaxError: Invalid flags supplied to RegExp constructor 'gg' null true

// Wichtig · Fallstricke

  • Doppelte Backslashes: new RegExp("\d") ergibt das Muster d, da "\d" im String schon zu "d" wird. Verwenden Sie "\\d" oder String.raw.
  • Sicherheit (ReDoS / Injection): Benutzereingaben niemals ungeprüft als Muster verwenden. Unescapte Eingaben verändern die Bedeutung des Ausdrucks, und gezielt konstruierte Muster wie (a+)+$ können durch katastrophales Backtracking den Thread blockieren (besonders kritisch in Node.js-Servern). Eingaben escapen oder Länge/Komplexität begrenzen. RegExp.escape() ist neu (ES2025) und noch nicht überall verfügbar.
  • Zustand bei g/y: Wiederverwendete Objekte merken sich lastIndex; wiederholte test()-Aufrufe können dadurch abwechselnd true/false liefern.
  • Performance: Konstruktor nicht in engen Schleifen mit gleichem Muster aufrufen – einmal erzeugen und wiederverwenden. Für statische Muster ist das Literal vorzuziehen.
  • Kompatibilität: Flag s ab ES2018, d ab ES2022, v ab ES2024 – in älteren Umgebungen führen sie zu SyntaxError.