Reguläre Ausdrücke

Ein regulärer Ausdruck (kurz regex) ermöglicht es Entwicklern, Zeichenketten anhand eines Musters zu überprüfen, Informationen über Teilübereinstimmungen zu extrahieren oder einfach zu testen, ob die Zeichenkette diesem Muster entspricht. Reguläre Ausdrücke werden in vielen Programmiersprachen verwendet, und die Syntax in JavaScript ist von Perl inspiriert.

Es wird empfohlen, den Leitfaden zu regulären Ausdrücken zu lesen, um einen Überblick über die verfügbaren regex-Syntaxen und deren Funktionsweise zu erhalten.

Beschreibung

Reguläre Ausdrücke sind ein wichtiges Konzept in der Theorie formaler Sprachen. Sie sind eine Möglichkeit, eine möglicherweise unendliche Menge von Zeichenketten (als Sprache bezeichnet) zu beschreiben. Ein regulärer Ausdruck benötigt im Wesentlichen die folgenden Merkmale:

  • Eine Menge von Zeichen, die in der Sprache verwendet werden können, genannt das Alphabet.
  • Konkatenation: ab bedeutet "das Zeichen a gefolgt von dem Zeichen b".
  • Vereinigung: a|b bedeutet "entweder a oder b".
  • Kleene-Stern: a* bedeutet "null oder mehr a Zeichen".

Angenommen, es gibt ein endliches Alphabet (wie die 26 Buchstaben des englischen Alphabets oder das gesamte Unicode-Zeichensatz), können alle regulären Sprachen durch die obigen Merkmale generiert werden. Natürlich sind viele Muster auf diese Weise sehr mühsam auszudrücken (wie "10 Ziffern" oder "ein Zeichen, das kein Leerzeichen ist"), daher beinhalten JavaScript-reguläre Ausdrücke viele Abkürzungen, die unten eingeführt werden.

Hinweis: JavaScript-reguläre Ausdrücke sind in der Tat nicht regulär, aufgrund der Existenz von Rückverweisen (reguläre Ausdrücke müssen endliche Zustände haben). Trotzdem sind sie immer noch ein sehr nützliches Merkmal.

Reguläre Ausdrücke erstellen

Ein regulärer Ausdruck wird typischerweise als Literal erstellt, indem ein Muster in Schrägstriche (/) eingeschlossen wird:

js
const regex1 = /ab+c/g;

Reguläre Ausdrücke können auch mit dem RegExp()-Konstruktor erstellt werden:

js
const regex2 = new RegExp("ab+c", "g");

Sie haben zur Laufzeit keine Unterschiede, obwohl sie Auswirkungen auf die Leistung, die statische Analysierbarkeit und ergonomische Probleme beim Schreiben mit entweichenden Zeichen haben können. Weitere Informationen finden Sie im RegExp-Referenz.

Regex-Flags

Flags sind spezielle Parameter, die die Interpretation eines regulären Ausdrucks oder seine Interaktion mit dem Eingabetext ändern können. Jedes Flag entspricht einer accessor-Eigenschaft des RegExp-Objekts.

Flag Beschreibung Entsprechende Eigenschaft
d Erzeugt Indizes für Teilzeichenfolgenübereinstimmungen. hasIndices
g Globale Suche. global
i Groß-/Kleinschreibung wird ignoriert. ignoreCase
m Ermöglicht es, dass ^ und $ neben Zeilenumbrüchen übereinstimmen. multiline
s Erlaubt es . Zeilenumbrüche zu matchen. dotAll
u "Unicode"; behandelt ein Muster als eine Folge von Unicode-Codepunkten. unicode
v Ein Upgrade zum u-Modus mit mehr Unicode-Features. unicodeSets
y Führt eine "sticky" Suche durch, die ab der aktuellen Position im Zielstring übereinstimmt. sticky

Die Flags i, m und s können für bestimmte Teile eines Regex mit Hilfe der Modifikator-Syntax aktiviert oder deaktiviert werden.

Die untenstehenden Abschnitte listen alle verfügbaren Regex-Syntaxen auf, gruppiert nach ihrer syntaktischen Natur.

Assertionen

Assertionen sind Konstrukte, die testen, ob die Zeichenkette an der angegebenen Position eine bestimmte Bedingung erfüllt, ohne jedoch Zeichen zu konsumieren. Assertionen können nicht quantifiziert werden.

Eingriffsgrenze Assertion: ^, $

Bestätigt, dass die aktuelle Position der Anfang oder das Ende des Eingangs, oder der Anfang oder das Ende einer Zeile ist, wenn das m-Flag gesetzt ist.

Lookahead-Assertion: (?=...), (?!...)

Bestätigt, dass die aktuelle Position gefolgt oder nicht gefolgt von einem bestimmten Muster ist.

Lookbehind-Assertion: (?<=...), (?<!...)

Bestätigt, dass die aktuelle Position vorangestellt oder nicht vorangestellt von einem bestimmten Muster ist.

Wortgrenzen-Assertion: \b, \B

Bestätigt, dass die aktuelle Position eine Wortgrenze ist.

Atome

Atome sind die grundlegendsten Einheiten eines regulären Ausdrucks. Jedes Atom konsumiert ein oder mehrere Zeichen in der Zeichenkette und scheitert entweder an der Übereinstimmung oder erlaubt es dem Muster, mit dem nächsten Atom fortzufahren.

Rückverweis: \1, \2

Entspricht einem zuvor übereinstimmenden Untermuster, das mit einer fangenden Gruppe erfasst wurde.

Fangende Gruppe: (...)

Entspricht einem Untermuster und speichert Informationen über die Übereinstimmung.

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

Entspricht jedem Zeichen in oder nicht in einer Gruppe von Zeichen. Wenn das v Flag gesetzt ist, kann sie auch verwendet werden, um Zeichenketten mit endlicher Länge zu matchen.

Zeichenklassenescape: \d, \D, \w, \W, \s, \S

Entspricht einem Zeichen in oder nicht in einer vordefinierten Gruppe von Zeichen.

Zeichenescape: \n, \u{...}

Entspricht einem Zeichen, das möglicherweise nicht bequem in seiner literalen Form dargestellt werden kann.

Literales Zeichen: a, b

Entspricht einem bestimmten Zeichen.

Modifikator: (?ims-ims:...)

Überschreibt die Flag-Einstellungen in einem bestimmten Teil eines regulären Ausdrucks.

Benannte Rückverweisung: \k<name>

Entspricht einem zuvor übereinstimmenden Untermuster, das mit einer benannten fangenden Gruppe erfasst wurde.

Benannte fangende Gruppe: (?<name>...)

Entspricht einem Untermuster und speichert Informationen über die Übereinstimmung. Die Gruppe kann später durch einen benutzerdefinierten Namen anstelle durch ihren Index im Muster identifiziert werden.

Nicht-fangende Gruppe: (?:...)

Entspricht einem Untermuster ohne Speichern von Informationen über die Übereinstimmung.

Unicode-Zeichenklassenescape: \p{...}, \P{...}

Entspricht einem Satz von Zeichen, die durch eine Unicode-Eigenschaft angegeben werden. Wenn das v Flag aktiviert ist, kann es auch verwendet werden, um Zeichenfolgen mit endlicher Länge zu matchen.

Wildcard: .

Entspricht jedem Zeichen außer Zeilenumbruch-Zeichen, es sei denn, das s-Flag ist gesetzt.

Andere Funktionen

Diese Funktionen spezifizieren selbst kein Muster, werden aber verwendet, um Muster zu komponieren.

Disjunktion: |

Entspricht einem von mehreren Alternativen, die durch das |-Zeichen getrennt sind.

Quantifizierer: *, +, ?, {n}, {n,}, {n,m}

Entspricht einem Atom eine bestimmte Anzahl von Malen.

Escape-Sequenzen

Escape-Sequenzen in regexes beziehen sich auf jede Art von Syntax, die durch \ gefolgt von einem oder mehreren Zeichen gebildet wird. Sie können je nach den folgenden \ sehr unterschiedliche Zwecke erfüllen. Unten ist eine Liste aller gültigen "Escape-Sequenzen":

Escape-Sequenz Gefolgt von Bedeutung
\B Keine Nicht-Wortgrenze-Assertion
\D Keine Zeichenklassenescape, das nicht-Ziffern-Zeichen repräsentiert
\P {, eine Unicode-Eigenschaft und/oder ein Wert, dann } Unicode-Zeichenklassenescape, das Zeichen ohne die angegebene Unicode-Eigenschaft repräsentiert
\S Keine Zeichenklassenescape, das nicht-Leerraum-Zeichen repräsentiert
\W Keine Zeichenklassenescape, das nicht-Wort-Zeichen repräsentiert
\b Keine Wortgrenze-Assertion; innerhalb von Zeichenklassen repräsentiert es U+0008 (RÜCKSCHRITT)
\c Ein Buchstabe von A bis Z oder a bis z Ein Zeichenescape, das das Steuerzeichen mit dem Wert gleich dem Charakterwert des Buchstabens modulo 32 repräsentiert
\d Keine Zeichenklassenescape, das Ziffernzeichen (0 bis 9) repräsentiert
\f Keine Zeichenescape, das U+000C (FORMULARVORSCHUB) repräsentiert
\k <, ein Bezeichner, dann > Ein benannter Rückverweis
\n Keine Zeichenescape, das U+000A (ZEILENUMBRUCH) repräsentiert
\p {, eine Unicode-Eigenschaft und/oder ein Wert, dann } Unicode-Zeichenklassenescape, das Zeichen mit der angegebenen Unicode-Eigenschaft repräsentiert
\q {, eine Zeichenkette, dann } Nur gültig innerhalb von v-Modus-Zeichenklassen; repräsentiert die Zeichenkette, die buchstäblich gematcht werden soll
\r Keine Zeichenescape, das U+000D (WAGENRÜCKLAUF) repräsentiert
\s Keine Zeichenklassenescape, das Leerraum-Zeichen repräsentiert
\t Keine Zeichenescape, das U+0009 (ZEICHENTABULATION) repräsentiert
\u 4 hexadezimale Ziffern; oder {, 1 bis 6 hexadezimale Ziffern, dann } Zeichenescape, das das Zeichen mit dem angegebenen Codepunkt repräsentiert
\v Keine Zeichenescape, das U+000B (ZEILENTABULATION) repräsentiert
\w Keine Zeichenklassenescape, das Wortzeichen (A bis Z, a bis z, 0 bis 9, _) repräsentiert
\x 2 hexadezimale Ziffern Zeichenescape, das das Zeichen mit dem gegebenen Wert repräsentiert
\0 Keine Zeichenescape, das U+0000 (NULL) repräsentiert

\ gefolgt von 0 und einer anderen Ziffer wird zu einer veralteten oktalen Escape-Sequenz, die im Unicode-bewussten Modus verboten ist. \ gefolgt von einer anderen Ziffernfolge wird zu einem Rückverweis.

Darüber hinaus kann \ von einigen nicht-Buchstaben-oder-Ziffern-Zeichen gefolgt werden, wobei die Escape-Sequenz immer ein Zeichenescape ist, das das entkommene Zeichen selbst repräsentiert:

  • \$, \(, \), \*, \+, \., \/, \?, \[, \\, \], \^, \{, \|, \}: überall gültig
  • \-: nur gültig innerhalb von Zeichenklassen
  • \!, \#, \%, \&, \,, \:, \;, \<, \=, \>, \@, \`, \~: nur gültig innerhalb von v-Modus Zeichenklassen

Die anderen ASCII-Zeichen, nämlich das Leerzeichen, ", ', _, und alle Buchstabenzeichen, die oben nicht erwähnt wurden, sind keine gültigen Escape-Sequenzen. Im Unicode-unbewussten Modus werden Escape-Sequenzen, die nicht oben stehen, zu Identitäts-Escapes: Sie repräsentieren das Zeichen, das dem Backslash folgt. Zum Beispiel repräsentiert \a das Zeichen a. Dieses Verhalten schränkt die Möglichkeit ein, neue Escape-Sequenzen einzuführen, ohne Rückwärtskompatibilitätsprobleme zu verursachen, und ist daher im Unicode-bewussten Modus verboten.

Spezifikationen

Specification
ECMAScript Language Specification
# prod-DecimalEscape
ECMAScript Language Specification
# prod-Atom
ECMAScript Language Specification
# prod-CharacterClass
ECMAScript Language Specification
# prod-CharacterClassEscape
ECMAScript Language Specification
# prod-CharacterEscape
ECMAScript Language Specification
# prod-Disjunction
ECMAScript Language Specification
# prod-Assertion
ECMAScript Language Specification
# prod-PatternCharacter
Unknown specification
# syntax
ECMAScript Language Specification
# prod-AtomEscape
ECMAScript Language Specification
# prod-Quantifier

Browser-Kompatibilität

BCD tables only load in the browser

Siehe auch