Start · Sprachen · JavaScript · Referenz · RegExp.prototype.unicode

RegExp.prototype.unicode

Eigenschaft

Schreibgeschützte Zugriffseigenschaft, die <code>true</code> liefert, wenn der reguläre Ausdruck mit dem <code>u</code>-Flag (Unicode-Modus) erstellt wurde, sonst <code>false</code>.

seit JavaScript ES2015 (Baseline: alle modernen Browser, Node.js 6 Kategorie: method-property

Signatur

get RegExp.prototype.unicode

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 einen SyntaxError aus.
  • Bei den Flags g oder y rückt lastIndex nach 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

Typ
boolean | undefined
Beschreibung
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
true false u 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
2 false true 7 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)
false true giu ["Gr", "e"]

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
true ["Café", "naïve", "Ωmega"] true

// Wichtig · Fallstricke

  • Schreibgeschützt: Die Eigenschaft hat nur einen Getter. Eine Zuweisung wie re.unicode = true wird im nicht-strikten Modus ohne Meldung ignoriert und wirft im Strict Mode einen TypeError. 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 Flag v (unicodeSets) laufen ebenfalls im Unicode-Modus, trotzdem liefert unicode dort false. Prüfe deshalb re.unicode || re.unicodeSets. Die Flags u und v gleichzeitig zu setzen, führt zu einem SyntaxError.
  • Strengere Syntax: Wer einem bestehenden Ausdruck nachträglich das u-Flag hinzufügt, kann einen SyntaxError auslösen, z. B. bei /\-/ oder /a{/. Umschließe dynamisch erzeugte Ausdrücke daher mit try…catch.
  • Kein Ersatz für Graphem-Segmentierung: Auch mit u gelten zusammengesetzte Zeichen als mehrere Codepunkte, z. B. Emojis mit Hautton (👍🏽) oder Familien-Emojis mit ZWJ. Für echte „sichtbare Zeichen“ verwendest du Intl.Segmenter.
  • Wird der Getter auf einem Objekt aufgerufen, das kein RegExp ist, wirft er einen TypeError. Die Ausnahme ist RegExp.prototype selbst, dort ergibt er undefined.
  • Kompatibilität: Alle aktuellen Browser und Node.js unterstützen die Eigenschaft. Der Internet Explorer unterstützt sie nicht.