Signatur
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
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
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
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
}
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' ]
// 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
patterneinRegExpundflagsnichtundefined, gibt es einen Fehler. Ungültige Flags oder eine ungültige Syntax lösen einenSyntaxErroraus. - Unterklassen und andere Realms: Nach dem Vorschlag „Legacy RegExp features“ darf
compile()bei Instanzen vonRegExp-Unterklassen oder Objekten aus einem anderen Realm einenTypeErrorwerfen. 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).