Signatur
Beschreibung
Die Zugriffseigenschaft unicode zeigt an, ob ein RegExp-Objekt mit dem u-Flag erzeugt wurde. Der Wert wird beim Erstellen des Ausdrucks festgelegt und lässt sich später nicht mehr ändern. Er entspricht dem Vorkommen von "u" in regex.flags.
Mit dem u-Flag verarbeitet die RegExp-Engine den String als Folge von Unicode-Codepunkten und nicht als Folge von UTF-16-Codeeinheiten. Das hat mehrere Folgen:
- Zeichen außerhalb der Basic Multilingual Plane, z. B. Emojis wie
😀, zählen als ein Zeichen.., Quantoren und Zeichenklassen erfassen also das ganze Zeichen und nicht nur eine Hälfte eines Surrogatpaars. - Codepunkt-Escapes wie
\u{1F600}und Unicode-Property-Escapes wie\p{L}oder\p{Emoji}sind erst dann erlaubt. - Die Syntax wird strenger geprüft: Unnötige Escapes wie
\-außerhalb von Zeichenklassen oder ein alleinstehendes{lösen einenSyntaxErroraus. - Bei den Flags
goderyrücktlastIndexnach leeren Treffern um einen ganzen Codepunkt vor.
Du brauchst die Eigenschaft vor allem in Hilfsfunktionen, die fremde reguläre Ausdrücke entgegennehmen und je nach Modus anders reagieren müssen. Ein Beispiel ist das Klonen eines Ausdrucks mit zusätzlichen Flags oder die Prüfung, ob Property-Escapes sicher verwendet werden können.
Rückgabewert
true, wenn das u-Flag gesetzt ist, sonst false. Wenn der Getter direkt auf RegExp.prototype aufgerufen wird, liefert er undefined.Beispiele
Flag abfragen
const mitU = /\u{1F600}/u;
const ohneU = /abc/gi;
console.log(mitU.unicode); // true
console.log(ohneU.unicode); // false
console.log(mitU.flags); // "u"
// Auch beim Konstruktor-Aufruf
const dynamisch = new RegExp('\\p{Lu}', 'u');
console.log(dynamisch.unicode); // true
Unterschied bei Emojis und Surrogatpaaren
const emoji = '😀';
console.log(emoji.length); // 2 (UTF-16-Codeeinheiten)
console.log(/^.$/.test(emoji)); // false – '.' trifft nur eine Hälfte
console.log(/^.$/u.test(emoji)); // true – ein Codepunkt
// Zeichen korrekt zählen
const text = 'Hi 👋🌍';
console.log(text.match(/./g).length); // 7
console.log(text.match(/./gu).length); // 5
Hilfsfunktion: Unicode-Modus nachrüsten
// Stellt sicher, dass ein Ausdruck im Unicode-Modus läuft
const ensureUnicode = (re) => {
if (re.unicode || re.unicodeSets) return re;
return new RegExp(re.source, re.flags + 'u');
};
const original = /[a-zäöü]+/gi;
const sicher = ensureUnicode(original);
console.log(original.unicode, sicher.unicode); // false true
console.log(sicher.flags); // "giu"
console.log('Größe 🚀'.match(sicher)); // ["Gr", "e"] (ß ist nicht in der Klasse)
Unicode-Property-Escapes nur mit u-Flag
const buchstaben = /\p{L}+/gu;
console.log(buchstaben.unicode); // true
console.log('Café, naïve, Ωmega'.match(buchstaben)); // ["Café", "naïve", "Ωmega"]
// Ohne u-Flag steht \p einfach für den Buchstaben 'p'
console.log(/\p{L}/.test('p{L}')); // true
// Wichtig · Fallstricke
- Schreibgeschützt: Die Eigenschaft hat nur einen Getter. Eine Zuweisung wie
re.unicode = truewird im nicht-strikten Modus ohne Meldung ignoriert und wirft im Strict Mode einenTypeError. Um das Flag zu ändern, musst du einen neuen Ausdruck erzeugen:new RegExp(re.source, re.flags + 'u'). v-Flag (ES2024): Ausdrücke mit dem Flagv(unicodeSets) laufen ebenfalls im Unicode-Modus, trotzdem liefertunicodedortfalse. Prüfe deshalbre.unicode || re.unicodeSets. Die Flagsuundvgleichzeitig zu setzen, führt zu einemSyntaxError.- Strengere Syntax: Wer einem bestehenden Ausdruck nachträglich das
u-Flag hinzufügt, kann einenSyntaxErrorauslösen, z. B. bei/\-/oder/a{/. Umschließe dynamisch erzeugte Ausdrücke daher mittry…catch. - Kein Ersatz für Graphem-Segmentierung: Auch mit
ugelten zusammengesetzte Zeichen als mehrere Codepunkte, z. B. Emojis mit Hautton (👍🏽) oder Familien-Emojis mit ZWJ. Für echte „sichtbare Zeichen“ verwendest duIntl.Segmenter. - Wird der Getter auf einem Objekt aufgerufen, das kein
RegExpist, wirft er einenTypeError. Die Ausnahme istRegExp.prototypeselbst, dort ergibt erundefined. - Kompatibilität: Alle aktuellen Browser und Node.js unterstützen die Eigenschaft. Der Internet Explorer unterstützt sie nicht.