Start · Sprachen · JavaScript · Referenz · Zeichenklasse: [...], [^...]

Zeichenklasse: [...], [^...]

Keyword

Eine Zeichenklasse in einem regulären Ausdruck passt auf genau ein Zeichen, das in der angegebenen Menge liegt (<code>[...]</code>) oder nicht darin liegt (<code>[^...]</code>).

seit JavaScript ES3 (Grundform); Flag u: ES2015; Flag v mit Mengen Kategorie: syntax

Signatur

/[Zeichen]/ · /[^Zeichen]/ · /[a-z]/ · /[A--B]/v · /[A&amp;&amp;B]/v

Beschreibung

Eine Zeichenklasse (englisch character class) steht in einem regulären Ausdruck für genau ein Zeichen aus einer selbst festgelegten Menge. [aeiou] passt auf einen beliebigen kleinen Vokal, [0-9a-f] auf eine Hexadezimalziffer. Steht direkt nach der öffnenden Klammer ein ^, wird die Klasse negiert: [^0-9] passt auf jedes Zeichen, das keine Ziffer ist, also auch auf Zeilenumbrüche.

Innerhalb der Klammern gelten eigene Regeln. Die meisten Sonderzeichen wie ., *, +, ?, (, ), | und $ verlieren ihre besondere Bedeutung und stehen einfach für sich selbst. Eine Sonderrolle haben nur:

  • \ für Escapes wie \d, \w, \s, \p{…}, \] oder \-
  • ], das die Klasse beendet
  • ^, aber nur ganz am Anfang (Negation)
  • - zwischen zwei Zeichen, das einen Bereich bildet (a-z). Am Anfang oder Ende der Klasse steht es für einen normalen Bindestrich.

Zwei Sonderfälle: [] passt auf nichts und lässt den Treffer deshalb immer scheitern. [^] passt auf jedes Zeichen, auch auf Zeilenumbrüche. Das ist eine alte Alternative zum Flag s (dotAll).

Mit dem Flag v (unicodeSets, ES2024) können Zeichenklassen mehr: Sie lassen sich verschachteln ([[a-z][0-9]]), als Schnittmenge (&&) oder Differenz (--) kombinieren und mit \q{…} ganze Zeichenfolgen enthalten. So lässt sich etwa „alle Buchstaben außer ASCII“ als [\p{L}--[a-zA-Z]] schreiben.

Parameter

Name Typ Default Beschreibung
$Zeichen Literalzeichen | Escape Einzelne Zeichen, die zur Menge gehören, z. B. abc. Escapes wie \d, \w, \s, \p{L} oder \u00e4 sind erlaubt.
$Bereich Zeichen-Zeichen Ein Bereich wie a-z oder \u0400-\u04FF. Er umfasst alle Codepunkte von Start bis Ende einschließlich. Ist der Start größer als das Ende, entsteht ein SyntaxError.
$^ Negationszeichen Muss direkt nach [ stehen. Dann passt die Klasse auf jedes Zeichen, das nicht in der Menge liegt.
$&& Operator (nur mit Flag v) Schnittmenge zweier Klassen, z. B. [\p{L}&&\p{Script=Greek}].
$-- Operator (nur mit Flag v) Differenz zweier Klassen, z. B. [\w--\d] (Wortzeichen ohne Ziffern).
$\q{…} String-Literal (nur mit Flag v) Nimmt ganze Zeichenfolgen in die Klasse auf, z. B. [\q{ch|sch}a-z]. Nicht erlaubt in negierten Klassen.

Rückgabewert

Typ
Musterbaustein (1 Zeichen)
Beschreibung
Keine Laufzeitrückgabe. Die Zeichenklasse verbraucht beim Abgleich genau ein Zeichen, mit Flag u/v einen ganzen Codepunkt. Mit \q{…} kann sie auch eine ganze Zeichenfolge verbrauchen. Das Ergebnis hängt von der aufrufenden Methode ab, etwa test(), match() oder replace().

Beispiele

Hexadezimalen Farbcode prüfen

const isHexColor = (str) => /^#[0-9a-f]{6}$/i.test(str);

console.log(isHexColor('#1A3fC0'));
console.log(isHexColor('#12G456'));
true false

Negierte Klasse: unerwünschte Zeichen entfernen

const input = 'Hallo, Welt! 123 – Grüße';
const onlyLetters = input.replace(/[^a-zäöüß]/gi, '');
console.log(onlyLetters);
HalloWeltGrüße

Bindestrich und Sonderzeichen literal verwenden

// '-' am Ende, '.' und '+' brauchen in der Klasse kein Escape
const local = /^[\w.+-]+$/;
console.log(local.test('max.mustermann+news-2024'));
console.log(local.test('max mustermann'));
true false

[^] passt auch auf Zeilenumbrüche

const text = 'Start\nMitte\nEnde';
console.log(/Start.*Ende/.test(text));   // '.' passt nicht auf \n
console.log(/Start[^]*Ende/.test(text)); // [^] passt auf alles
false true

Flag v: Differenz und Schnittmenge (ES2024)

// Alle Buchstaben außer ASCII-Buchstaben
const nonAscii = /[\p{L}--[a-zA-Z]]/gv;
console.log('Straße in Köln'.match(nonAscii));

// Griechische Buchstaben (Schnittmenge)
const greek = /[\p{Script=Greek}&&\p{L}]+/v;
console.log('Formel: αβγ = 42'.match(greek)[0]);
[ 'ß', 'ö' ] αβγ

Emoji korrekt abgleichen mit Flag u

console.log(/^[😀😎]$/.test('😀'));  // ohne u: Surrogat-Hälften
console.log(/^[😀😎]$/u.test('😀')); // mit u: ganzer Codepunkt
false true