[ Web Proxy ]
URL:
Viewing: https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Regular_expressions/Character_class [Back]  [Original]

Zeichenklasse: [...], [^...] - JavaScript | MDN

Dieser Inhalt wurde automatisch aus dem Englischen bersetzt, und kann Fehler enthalten. Erfahre mehr ber dieses Experiment.

View in English Always switch to English

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

Baseline Weitgehend verfgbar

Diese Funktion ist gut etabliert und funktioniert auf vielen Gerten und in vielen Browserversionen. Sie ist seit Juli 2015 browserbergreifend verfgbar.

Eine Zeichenklasse entspricht jedem Zeichen in oder nicht in einer benutzerdefinierten Zeichensatz. Wenn das v-Flag aktiviert ist, kann es auch zum Abgleich von Zeichenfolgen mit endlicher Lnge verwendet werden.

In diesem Artikel

Syntax

regex
[]
[abc]
[A-Z]

[^]
[^abc]
[^A-Z]

// `v` mode only
[operand1&&operand2]
[operand1--operand2]
[\q{substring}]

Parameter

operand1, operand2

Kann ein einzelnes Zeichen, eine andere in eckige Klammern eingeschlossene Zeichenklasse, eine Zeichenklassen-Escape, eine Unicode-Zeichenklassen-Escape oder eine Zeichenfolge im \q-Syntax sein.

substring

Eine literale Zeichenfolge.

Beschreibung

Eine Zeichenklasse gibt eine Liste von Zeichen zwischen eckigen Klammern an und entspricht jedem Zeichen in der Liste. Das v-Flag verndert drastisch, wie Zeichenklassen geparst und interpretiert werden. Es sind folgende Syntaxen sowohl im v-Modus als auch im Nicht-v-Modus verfgbar:

  • Ein einzelnes Zeichen: entspricht dem Zeichen selbst.
  • Ein Bereich von Zeichen: entspricht jedem Zeichen im inklusiven Bereich. Der Bereich wird durch zwei Zeichen angegeben, die durch einen Bindestrich (-) getrennt sind. Das erste Zeichen muss im Zeichenwert kleiner sein als das zweite Zeichen. Der Zeichenwert ist der Unicode-Codepunkt des Zeichens. Da Unicode-Codepunkte in der Regel alphabetisch zugewiesen werden, spezifiziert [a-z] alle lateinischen Kleinbuchstaben, whrend [-] alle griechischen Kleinbuchstaben spezifiziert. Im Unicode-unwahrnehmbaren Modus werden Regex als Sequenz von BMP-Zeichen interpretiert. Daher reprsentieren Surrogatpaare in Zeichenklassen zwei Zeichen anstelle von einem; siehe unten fr Details.
  • Escape-Sequenzen: \b, \-, Zeichenklassen-Escapes, Unicode-Zeichenklassen-Escapes und andere Zeichen-Escapes.

Diese Syntaxen knnen beliebig oft vorkommen, und die von ihnen dargestellten Zeichenstze werden vereinigt. Zum Beispiel, /[a-zA-Z0-9]/ entspricht jedem Buchstaben oder Ziffer.

Das ^-Prfix in einer Zeichenklasse erzeugt eine Komplementklasse. Zum Beispiel entspricht [^abc] jedem Zeichen auer a, b oder c. Das ^-Zeichen ist ein literales Zeichen, wenn es in der Mitte einer Zeichenklasse erscheint zum Beispiel entspricht [a^b] den Zeichen a, ^, und b.

Die lexikalische Grammatik fhrt eine sehr grobe Analyse von Regex-Literalen durch, sodass es das Regex-Literal nicht bei einem /-Zeichen beendet, das innerhalb einer Zeichenklasse erscheint. Dies bedeutet, dass /[/]/ ohne Notwendigkeit der Escape-Sequenzierung des / gltig ist.

Die Grenzen eines Zeichenbereichs drfen nicht mehr als ein Zeichen angeben, was passiert, wenn Sie ein Zeichenklassen-Escape verwenden. Zum Beispiel:

js
/[\s-9]/u; // SyntaxError: Invalid regular expression: Invalid character class

Im Unicode-unwahrnehmbaren Modus verursachen Zeichenbereiche, bei denen eine Grenze eine Zeichenklasse ist, dass das - zu einem literal Zeichen wird. Dies ist eine veraltete Syntax fr Webkompatibilitt, und Sie sollten sich nicht darauf verlassen.

js
/[\s-9]/.test("-"); // true

Im Unicode-unwahrnehmbaren Modus werden Regex als eine Sequenz von BMP-Zeichen interpretiert. Daher reprsentieren Surrogatpaare in Zeichenklassen zwei Zeichen statt eines.

js
/[]/.test("\ud83d"); // true
/[]/u.test("\ud83d"); // false

/[-]/.test(""); // SyntaxError: Invalid regular expression: /[-]/: Range out of order in character class
/[-]/u.test(""); // true

Selbst wenn das Muster Gro-/Kleinschreibung ignoriert, ist die Gro-/Kleinschreibung der beiden Enden eines Bereichs signifikant bei der Bestimmung, welche Zeichen zum Bereich gehren. Zum Beispiel entspricht das Muster /[E-F]/i nur E, F, e, und f, whrend das Muster /[E-f]/i alle Gro- und Kleinbuchstaben ASCII-Buchstaben trifft (weil es EZ und af berspannt), sowie [, \, ], ^, _, und `.

Nicht-v-Modus Zeichenklasse

Nicht-v-Modus Zeichenklassen interpretieren die meisten Zeichen buchstblich und haben weniger Einschrnkungen bezglich der Zeichen, die sie enthalten knnen. Zum Beispiel ist . der buchstbliche Punkt und nicht der Platzhalter. Die einzigen Zeichen, die nicht buchstblich erscheinen knnen, sind \, ], und -.

  • In Zeichenklassen werden die meisten Escape-Sequenzen untersttzt, auer \b, \B, und Rckverweise. \b zeigt ein Rckschrittszeichen anstelle einer Wortgrenze an, whrend die beiden anderen Syntaxfehler verursachen. Um \ buchstblich zu verwenden, entziffern Sie es als \\.
  • Das ]-Zeichen zeigt das Ende der Zeichenklasse an. Um es buchstblich zu verwenden, entziffern Sie es als \].
  • Das Bindestrich (-) Zeichen, wenn es zwischen zwei Zeichen verwendet wird, zeigt einen Bereich an. Wenn es am Anfang oder Ende einer Zeichenklasse erscheint, ist es ein buchstbliches Zeichen. Es ist auch ein buchstbliches Zeichen, wenn es im Grenzbereich eines Bereichs verwendet wird. Zum Beispiel entspricht [a-] den Zeichen a und -, [!--] entspricht den Zeichen ! bis -, und [--9] entspricht den Zeichen - bis 9. Sie knnen es auch als \- entschlsseln, wenn Sie es irgendwo buchstblich verwenden mchten.

v-Modus Zeichenklasse

Das grundlegende Konzept der Zeichenklassen im v-Modus bleibt dasselbe: Sie knnen weiterhin die meisten Zeichen buchstblich verwenden, - verwenden, um Zeichenbereiche zu kennzeichnen, und Escape-Sequenzen verwenden. Eines der wichtigsten Merkmale des v-Flags ist die Mengenotation innerhalb der Zeichenklassen. Wie zuvor erwhnt, knnen normale Zeichenklassen Vereinigungen durch das Aneinanderreihen von zwei Bereichen darstellen, z. B. die Verwendung von [A-Z0-9], um "die Vereinigung der Menge [A-Z] und der Menge [0-9]" zu bedeuten. Es gibt jedoch keine einfache Mglichkeit, andere Operationen mit Zeichenstzen darzustellen, wie Schnittmenge und Differenz.

Mit dem v-Flag wird die Schnittmenge mit && ausgedrckt und die Subtraktion mit --. Das Fehlen beider impliziert eine Vereinigung. Die beiden Operanden von && oder -- knnen ein Zeichen, Zeichen-Escape, Zeichenklassen-Escape oder sogar eine andere Zeichenklasse sein. Zum Beispiel knnten Sie "ein Wortzeichen, das kein Unterstrich ist" mit [\w--_] ausdrcken. Sie knnen Operatoren nicht auf derselben Ebene mischen. Zum Beispiel ist [\w&&[A-z]--_] ein Syntaxfehler. Da Sie jedoch Zeichenklassen verschachteln knnen, knnen Sie explizit schreiben, indem Sie [\w&&[[A-z]--_]] oder [[\w&&[A-z]]--_] schreiben (die beide [A-Za-z] bedeuten). In hnlicher Weise ist [AB--C] ungltig und Sie mssen [A[B--C]] schreiben (was einfach [AB] bedeutet).

Im v-Modus kann die Unicode-Zeichenklassen-Escape \p Zeichenfolgen mit endlicher Lnge abgleichen, wie z. B. Emojis. Der Symmetrie halber knnen regulre Zeichenklassen auch mehr als ein Zeichen bereinstimmen. Um einen "Stringliteral" in einer Zeichenklasse zu schreiben, umschlieen Sie die Zeichenfolge in \q{...}. Die einzige untersttzte Regex-Syntax hier ist die Disjunktion abgesehen von diesem muss \q vollstndig literale Zeichen (einschlielich escapierter Zeichen) umschlieen. Dies stellt sicher, dass Zeichenklassen nur Zeichenfolgen mit endlicher Lnge mit endlich vielen Mglichkeiten bereinstimmen knnen.

Im Gegensatz zu regulren Disjunktionen spielt die Reihenfolge der Alternativen innerhalb von \q keine Rolle, ebenso wenig die Reihenfolge der \q-Escape mit dem Rest der verbundeten Operanden. Whrend des Abgleichs werden alle in einer Zeichenklasse angegebenen Alternativen immer in absteigender Lngenreihenfolge versucht, sodass der Abgleich gierig ist. Zum Beispiel werden [\q{a|ab}], [\q{ab|a}], [\q{ab}a], und [a\q{ab}], die auf "ab" angewendet werden, alle "ab" entsprechen.

Komplementzeichenklassen [^...] knnen keine Zeichenfolgen mit mehr als einem Zeichen bereinstimmen. Zum Beispiel ist [\q{ab|c}] gltig und entspricht der Zeichenfolge "ab", aber [^\q{ab|c}] ist ungltig, weil es unklar ist, wie viele Zeichen konsumiert werden sollten. Die berprfung wird durch berprfen durchgefhrt, ob alle \q einzelne Zeichen enthalten und alle \p Zeichen Eigenschaften spezifizieren fr Vereinigungen mssen alle Operanden ausschlielich Zeichen sein; fr Schnittmengen muss zumindest ein Operand ausschlielich Zeichen sein; fr Subtraktionen muss der linkeste Operand ausschlielich Zeichen sein. Die berprfung ist syntaktisch und betrachtet nicht die tatschlichen Zeichenstze, die spezifiziert werden, was bedeutet, dass obwohl /[^\q{ab|c}--\q{ab}]/v gleichwertig mit /[^c]/v ist, es immer noch abgelehnt wird.

Da die Syntax der Zeichenklassen jetzt ausgereifter ist, sind mehr Zeichen reserviert und es ist verboten, sie buchstblich erscheinen zu lassen.

  • Zustzlich zu ] und \ mssen die folgenden Zeichen als literale Zeichen in Zeichenklassen entcodiert werden: (, ), [, {, }, /, -, |. Diese Liste ist der Liste der Syntaxzeichen etwas hnlich, auer dass ^, $, *, +, und ? innerhalb von Zeichenklassen nicht reserviert sind, whrend / und - auerhalb von Zeichenklassen nicht reserviert sind (obwohl / ein Regex-Literal abgrenzen kann und daher immer noch entschlsselt werden muss). Alle diese Zeichen knnen auch optional in u-Modus-Zeichenklassen entcodiert werden.
  • Die folgenden "Doppelpunkte"-Sequenzen mssen ebenfalls entschlsselt werden (aber sie machen ohne das v-Flag sowieso nicht viel Sinn): &&, !!, ##, $$, %%, **, ++, ,,, .., ::, ;;, <<, ==, >>, ??, @@, ^^, ``, ~~. Im u-Modus knnen einige dieser Zeichen nur buchstblich innerhalb von Zeichenklassen erscheinen und verursachen einen Syntaxfehler, wenn sie entschlsselt werden. Im v-Modus mssen sie entschlsselt werden, wenn sie paarweise erscheinen, knnen aber optional entschlsselt werden, wenn sie allein erscheinen. Zum Beispiel ist /[\!]/u ungltig, weil es ein Identitts-Escape ist, aber sowohl /[\!]/v als auch /[!]/v sind gltig, whrend /[!!]/v ungltig ist. Der literale Zeichen-Verweis hat eine detaillierte Tabelle, welche Zeichen entschlsselt oder unentziffert erscheinen knnen.

Komplementklassen und case-insensitive Matching

Case-insensitive Matching funktioniert, indem sowohl der erwartete Zeichensatz als auch der abgeglichene String case-gefolded werden. Bei der Spezifikation von Komplementklassen ist die Reihenfolge, in der JavaScript case-folding und Komplementierung durchfhrt, wichtig. Kurz gesagt, [^...] im u-Modus entspricht allCharacters - caseFold(original), whrend im v-Modus zu caseFold(allCharacters) - caseFold(original) entspricht. Dies stellt sicher, dass alle Komplementklassensyntaxen, einschlielich [^...], \P, \W, etc., sich gegenseitig ausschlieen.

Betrachten Sie die folgenden beiden Regex (um die Dinge zu vereinfachen, nehmen wir an, dass Unicode-Zeichen eine von drei Arten sind: Kleinbuchstabe, Grobuchstabe und caseless, und jeder Grobuchstabe hat einen einzigartigen Kleinbuchstaben-Gegenstck, und umgekehrt):

js
const r1 = /\p{Lowercase_Letter}/iu;
const r2 = /[^\P{Lowercase_Letter}]/iu;

Das r2 ist eine doppelte Negation und scheint mit r1 gleichwertig zu sein. Aber tatschlich entspricht r1 allen Klein- und Grobuchstaben der ASCII-Buchstaben, whrend r2 keine entspricht. Hier ist eine schrittweise Erklrung:

  • In r1 konstruiert \p{Lowercase_Letter} eine Menge aller kleinen Buchstaben. Zeichen in dieser Menge werden dann auf ihre Kleinformat umgeformt, sodass sie gleich bleiben. Der Eingabestring wird ebenfalls auf Kleinbuchstaben umgeformt. Daher werden "A" und "a" zu "a" gefaltet und bereinstimmen mit r1.
  • In r2 konstruiert \P{Lowercase_Letter} zuerst eine Menge aller nicht-Kleinbuchstaben, d.h. Grobuchstaben und caseless Zeichen. Zeichen in dieser Menge werden dann auf ihre Kleinformat umgeformt, sodass der Zeichensatz zu allen kleinen Buchstaben und caseless Zeichen wird. [^...] negiert den Abgleich, wodurch es auf alles passt, was nicht in dieser Menge ist, d.h. ein Grobuchstabe. Der Eingabewert wird jedoch immer noch auf Kleinbuchstaben umgeformt, also wird "A" auf "a" gefaltet und von r2 nicht bereingestimmt.

Die Hauptbeobachtung hier ist, dass nach dem Negieren des Abgleichs durch [^...], der erwartete Zeichensatz mglicherweise nicht eine Untermenge des Satzes der gefalteten Unicode-Zeichen ist, was dazu fhrt, dass der gefaltete Eingabewert nicht im erwarteten Zeichensatz enthalten ist. Im v-Modus wird auch der Satz aller Zeichen case-gefolded. Der \P-Zeichenklassen selbst funktioniert im v-Modus leicht anders (siehe Unicode-Zeichenklassen-Escape). All dies stellt sicher, dass [^\P{Lowercase_Letter}] und \p{Lowercase_Letter} streng gleichwertig sind.

Beispiele

bereinstimmung von hexadezimalen Ziffern

Die folgende Funktion bestimmt, ob eine Zeichenfolge eine gltige hexadezimale Zahl enthlt:

js
function isHexadecimal(str) {
  return /^[0-9A-F]+$/i.test(str);
}

isHexadecimal("2F3"); // true
isHexadecimal("beef"); // true
isHexadecimal("undefined"); // false

Verwendung von Schnittmengen

Die folgende Funktion passt griechische Buchstaben.

js
function greekLetters(str) {
  return str.match(/[\p{Script_Extensions=Greek}&&\p{Letter}]/gv);
}

//  is U+1018A GREEK ZERO SIGN
greekLetters("P0A"); // [ '', '', '' ]

Verwendung der Subtraktion

Die folgende Funktion entspricht allen nicht-ASCII-Zahlen.

js
function nonASCIINumbers(str) {
  return str.match(/[\p{Decimal_Number}--\d]/gv);
}

//  is U+11739 AHOM DIGIT NINE
nonASCIINumbers("01a"); // [ '', '' ]

Zeichenfolgen abgleichen

Die folgende Funktion entspricht allen Zeilenbeendigungssequenzen, einschlielich der Zeilenbeendungszeichen und der Sequenz \r\n (CRLF). Die Reihenfolge, in der die Alternativen angegeben sind, spielt keine Rolle, da die lngste Alternative, \r\n, immer bevorzugt wird.

js
function getLineTerminatorSequences(str) {
  return str.match(/[\r\n\u2028\u2029\q{\r\n}]/gv);
}

getLineTerminatorSequences(`
A poem\r
Is split\rInto many
Stanzas
`); // ['\n', '\r\n', '\r', '\n', '\n']

Dieser regulre Ausdruck ist genau gleichwertig mit /(?:\r\n|\r|\n|\u2028|\u2029)/gu oder /(?:\r\n|[\r\n\u2028\u2029])/gu. Im regulren Disjunktion spielt jedoch die Reihenfolge der Alternativen eine Rolle, daher muss \r\n zuerst spezifiziert werden, damit es bevorzugt wird. Die Verwendung einer Zeichenklasse ist nicht nur krzer, sondern vermeidet auch diese Falle.

Der ntzlichste Fall von \q{} ist, wenn Subtraktion und Schnittmengen durchgefhrt werden. Bisher war dies mglich mit mehrfachen Lookaheads. Die folgende Funktion entspricht Flaggen, die nicht eine der amerikanischen, chinesischen, russischen, britischen und franzsischen Flaggen sind.

js
function notUNSCPermanentMember(flag) {
  return /^[\p{RGI_Emoji_Flag_Sequence}--\q{||||}]$/v.test(flag);
}

notUNSCPermanentMember(""); // false
notUNSCPermanentMember(""); // true

Dieses Beispiel ist grtenteils gleichwertig mit /^(?!||||)\p{RGI_Emoji_Flag_Sequence}$/v, vielleicht jedoch performanter.

Spezifikationen

Spezifikation
ECMAScript 2027 LanguageSpecification
# prod-CharacterClass

Browser-Kompatibilitt

Siehe auch


Web Proxy Viewer  |  New URL  |  Original Page