Start · Sprachen · JavaScript · Referenz · RegExp.prototype.compile()

RegExp.prototype.compile()

Methode

Kompiliert ein vorhandenes <code>RegExp</code>-Objekt mit neuem Muster und neuen Flags neu. Die Methode ist veraltet, stattdessen erzeugt man mit <code>new RegExp()</code> ein neues Objekt.

seit JavaScript ES2015 (Annex B, veraltet) – Baseline: alle Browse deprecated seit ja Kategorie: method-property

Signatur

RegExp.prototype.compile(pattern, flags)

Beschreibung

compile() ersetzt das Muster (source) und die Flags eines bereits vorhandenen regulären Ausdrucks. Das Objekt selbst bleibt dasselbe: Alle Variablen, die darauf zeigen, sehen danach den neuen Ausdruck. Außerdem setzt die Methode lastIndex auf 0 zurück.

Die Methode stammt aus den Anfängen von JavaScript. Damals sollte sie Leistung bringen, weil man einen Ausdruck „vorkompilieren“ und dann mehrfach verwenden konnte. Heutige Engines kompilieren und cachen reguläre Ausdrücke von selbst. Einen Leistungsgewinn bringt compile() deshalb nicht mehr.

In der Spezifikation steht compile() nur im Annex B (Kompatibilitätsfunktionen für Webbrowser) und gilt als veraltet. Man findet die Methode praktisch nur noch in altem Code. Für neuen Code nimmt man new RegExp(pattern, flags) und erzeugt damit ein neues, unveränderliches Muster-Objekt.

Parameter

Name Typ Default Beschreibung
$pattern string | RegExp undefined (ergibt das leere Muster (?:)) Der neue Mustertext als String oder ein anderes RegExp-Objekt. Bei einem RegExp werden dessen source und Flags übernommen.
$flags string undefined (keine Flags) Die neuen Flags, z. B. "gi". Erlaubt sind d, g, i, m, s, u, v und y. Ist pattern ein RegExp, muss flags weggelassen werden, sonst gibt es einen TypeError.

Rückgabewert

Typ
RegExp
Beschreibung
Das gleiche, veränderte RegExp-Objekt (this). Es wird kein neues Objekt erzeugt.

Beispiele

Muster und Flags eines vorhandenen Objekts ersetzen

const re = /foo/;
console.log(re.test('FOO')); // false

re.compile('foo', 'i');
console.log(re.source, re.flags); // foo i
console.log(re.test('FOO'));      // true
false foo i true

Identität bleibt erhalten, lastIndex wird zurückgesetzt

const re = /\d+/g;
const alias = re;

re.exec('abc 123 456');
console.log(re.lastIndex); // 7

const result = re.compile('[a-z]+', 'g');
console.log(result === re);    // true – kein neues Objekt
console.log(alias.source);     // [a-z]+
console.log(re.lastIndex);     // 0
7 true [a-z]+ 0

Ein anderes RegExp als Vorlage verwenden

const vorlage = /^[A-Z]{2}\d{4}$/i;
const re = /x/;

re.compile(vorlage); // übernimmt source und flags
console.log(re.source, re.flags); // ^[A-Z]{2}\d{4}$ i

try {
  re.compile(vorlage, 'g'); // zusätzliche Flags sind nicht erlaubt
} catch (e) {
  console.log(e instanceof TypeError); // true
}
^[A-Z]{2}\d{4}$ i true

Moderner Ersatz: new RegExp()

// Statt re.compile(...) einfach ein neues Objekt erzeugen
const buildSearch = (term) =>
  new RegExp(term.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'gi');

const re = buildSearch('a.b');
console.log('A.B und axb'.match(re)); // [ 'A.B' ]
[ 'A.B' ]

// Wichtig · Fallstricke

  • Veraltet: compile() gibt es nur noch aus Kompatibilitätsgründen (ECMAScript Annex B). In neuem Code sollte man es nicht verwenden. Linter wie ESLint und TypeScript-Typdefinitionen markieren die Methode als deprecated.
  • Kein Leistungsvorteil: Moderne Engines optimieren reguläre Ausdrücke von selbst. Den ursprünglichen Zweck, schneller zu sein, erfüllt die Methode nicht mehr.
  • Veränderung am Objekt selbst: Die Methode ändert das Objekt direkt (source, flags, lastIndex). Das betrifft alle Stellen, die eine Referenz auf das Objekt halten, und kann zu schwer auffindbaren Fehlern führen, z. B. bei gemeinsam genutzten Konstanten.
  • TypeError: Ist pattern ein RegExp und flags nicht undefined, gibt es einen Fehler. Ungültige Flags oder eine ungültige Syntax lösen einen SyntaxError aus.
  • Unterklassen und andere Realms: Nach dem Vorschlag „Legacy RegExp features“ darf compile() bei Instanzen von RegExp-Unterklassen oder Objekten aus einem anderen Realm einen TypeError werfen. Manche Engines tun das bereits.
  • Sicherheit: Wie bei new RegExp() gilt: Benutzereingaben vor dem Einbau ins Muster maskieren. Sonst drohen falsche Treffer oder ReDoS (Denial of Service durch extrem langsame Muster).