Reguläre Ausdrücke
Ein regulärer Ausdruck (kurz regex) ermöglicht es Entwicklern, Zeichenfolgen mit einem Muster abzugleichen, Informationen über Übereinstimmungen zu extrahieren oder einfach zu testen, ob die Zeichenfolge diesem Muster entspricht. Reguläre Ausdrücke werden in vielen Programmiersprachen verwendet, und die Syntax von 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 formalen Sprachtheorie. Sie sind eine Möglichkeit, eine möglicherweise unendliche Menge von Zeichenfolgen (eine Sprache genannt) 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:
abbedeutet "das Zeichenagefolgt von dem Zeichenb". - Vereinigung:
a|bbedeutet "entwederaoderb". - Kleene-Stern:
a*bedeutet "null oder mehraZeichen".
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 oben genannten 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 umfassen JavaScript-Reguläre Ausdrücke viele Abkürzungen, die im Folgenden eingeführt werden.
Hinweis: JavaScript-Reguläre Ausdrücke sind eigentlich nicht regulär, aufgrund der Existenz von Rückverweisen (reguläre Ausdrücke müssen endliche Zustände haben). Trotzdem sind sie ein sehr nützliches Merkmal.
Erstellung von regulären Ausdrücken
Ein regulärer Ausdruck wird typischerweise als Literal erstellt, indem ein Muster in Schrägstriche (/) eingeschlossen wird:
const regex1 = /ab+c/g;
Reguläre Ausdrücke können auch mit dem RegExp()-Konstruktor erstellt werden:
const regex2 = new RegExp("ab+c", "g");
Es gibt keine Laufzeitunterschiede, obwohl sie Auswirkungen auf die Leistung, Analysierbarkeit zur Laufzeit und ergonomische Probleme beim Erstellen mit Escape-Zeichen haben können. Weitere Informationen finden Sie in der RegExp Referenz.
Regex-Flags
Flags sind spezielle Parameter, die die Art und Weise ändern können, wie ein regulärer Ausdruck interpretiert wird oder wie er mit dem Eingabetext interagiert. Jedes Flag entspricht einer Accessor-Eigenschaft des RegExp-Objekts.
| Flag | Beschreibung | Entsprechende Eigenschaft |
|---|---|---|
d |
Erzeugt Indizes für Teilstring-Übereinstimmungen. | hasIndices |
g |
Globale Suche. | global |
i |
Groß-/Kleinschreibung ignorieren. | ignoreCase |
m |
Lässt ^ und $ den Anfang und das Ende jeder Zeile statt der ganzen Zeichenfolge abgleichen. |
multiline |
s |
Erlaubt . das Abgleichen von Zeilenendzeichen. |
dotAll |
u |
"Unicode"; behandelt ein Muster als eine Folge von Unicode-Codepunkten. | unicode |
v |
Eine Aufrüstung des u-Modus mit mehr Unicode-Funktionen. |
unicodeSets |
y |
Durchführung einer "Sticky"-Suche, die an der aktuellen Position in der Zielzeichenfolge beginnt. | sticky |
Die Flags i, m und s können mithilfe der Modifier-Syntax für spezifische Teile eines Regex aktiviert oder deaktiviert werden.
Die folgenden Abschnitte listen alle verfügbaren Regex-Syntaxen auf, gruppiert nach ihrer syntaktischen Natur.
Assertions
Assertions sind Konstrukte, die testen, ob die Zeichenfolge an der angegebenen Position eine bestimmte Bedingung erfüllt, jedoch keine Zeichen aufnehmen. Assertions können nicht quantifiziert werden.
- Buffer Boundary Assertion:
\A,\z,\Z -
Bestätigt, dass sich die aktuelle Position in der Zeichenfolge genau am Anfang oder Ende der gesamten Zeichenfolge befindet (
\Zerlaubt auch ein nachgestelltes Zeilenumbruch), unabhängig von der Anwesenheit desm-Flags. - Input Boundary Assertion:
^,$ -
Bestätigt, dass die aktuelle Position der Anfang oder das Ende der Eingabe ist, oder der Anfang oder das Ende einer Zeile, wenn das
m-Flag gesetzt ist. - Lookahead Assertion:
(?=...),(?!...) -
Bestätigt, dass die aktuelle Position von einem bestimmten Muster gefolgt oder nicht gefolgt wird.
- Lookbehind Assertion:
(?<=...),(?<!...) -
Bestätigt, dass die aktuelle Position von einem bestimmten Muster vorangegangen oder nicht vorangegangen ist.
- Word Boundary 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 Zeichenfolge und führt entweder dazu, dass die Übereinstimmung fehlschlägt oder das Muster mit dem nächsten Atom fortgesetzt wird.
- Backreference:
\1,\2 -
Stimmt mit einem zuvor übereingestimmten Teilmuster überein, das mit einer erfassenden Gruppe erfasst wurde.
- Erfassende Gruppe:
(...) -
Stimmt mit einem Teilmuster überein und merkt sich Informationen über die Übereinstimmung.
- Zeichenklasse:
[...],[^...] -
Stimmt mit einem Zeichen in einem Satz von Zeichen oder einem Zeichen, das nicht in einem Satz von Zeichen ist. Wenn das
v-Flag aktiviert ist, kann es auch verwendet werden, um Zeichenfolgen endlicher Länge abzugleichen. - Zeichenklassenescape:
\d,\D,\w,\W,\s,\S -
Stimmt mit einem Zeichen in einem vordefinierten Satz von Zeichen oder einem Charakter, der nicht in diesem Satz von Zeichen ist, überein.
- Zeichenescape:
\n,\u{...} -
Stimmt mit einem Zeichen überein, das möglicherweise nicht in seiner literalen Form bequem dargestellt werden kann.
- Literalzeichen:
a,b -
Stimmt mit einem bestimmten Zeichen überein.
- Modifizierer:
(?ims-ims:...) -
Überschreibt die Flag-Einstellungen in einem bestimmten Teil eines regulären Ausdrucks.
- Namentlicher Rückverweis:
\k<name> -
Stimmt mit einem zuvor übereingestimmten Teilmuster überein, das mit einer namentlich erfassten Gruppe erfasst wurde.
- Benannte Erfassungsgruppe:
(?<name>...) -
Stimmt mit einem Teilmuster überein und merkt sich Informationen über die Übereinstimmung. Die Gruppe kann später durch einen benutzerdefinierten Namen statt durch ihren Index im Muster identifiziert werden.
- Nicht-erfassende Gruppe:
(?:...) -
Stimmt mit einem Teilmuster überein, ohne Informationen über die Übereinstimmung zu merken.
- Unicode-Zeichenklassenescape:
\p{...},\P{...} -
Stimmt mit einem Satz von Zeichen überein, der durch eine Unicode-Eigenschaft angegeben wird. Wenn das
v-Flag aktiviert ist, kann es auch verwendet werden, um Zeichenfolgen endlicher Länge abzugleichen. - Wildcard:
. -
Stimmt mit jedem Zeichen außer Zeilenendzeichen überein, es sei denn, das
s-Flag ist gesetzt.
Andere Merkmale
Diese Merkmale spezifizieren kein Muster selbst, werden jedoch verwendet, um Muster zu komponieren.
- Disjunktion:
| -
Stimmt mit einem der Alternativen überein, die durch das
|-Zeichen getrennt sind. - Quantifizierer:
*,+,?,{n},{n,},{n,m} -
Stimmt mit einem Atom eine bestimmte Anzahl von Malen überein.
Escape-Sequenzen
Escape-Sequenzen in Regexen beziehen sich auf jede Art von Syntax, die durch \ gefolgt von einem oder mehreren Zeichen gebildet wird. Sie können sehr unterschiedliche Zwecke erfüllen, je nachdem, was \ folgt. Nachfolgend finden Sie eine Liste aller gültigen "Escape-Sequenzen":
| Escape-Sequenz | Gefolgt von | Bedeutung |
|---|---|---|
\A |
Keine | Buffer Boundary Assertion |
\B |
Keine | Nicht-Wort-Grenzen-Assertion |
\D |
Keine | Zeichenklassenescape, das nicht-Ziffern-Zeichen repräsentiert |
\P |
{, eine Unicode-Eigenschaft und/oder Wert, dann } |
Unicode-Zeichenklassenescape, das Zeichen ohne die angegebene Unicode-Eigenschaft repräsentiert |
\S |
Keine | Zeichenklassenescape, das nicht-Leerzeichen-Zeichen repräsentiert |
\W |
Keine | Zeichenklassenescape, das nicht-Wort-Zeichen repräsentiert |
\Z |
Keine | Buffer Boundary Assertion |
\b |
Keine | Wort-Grenzen-Assertion; innerhalb 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 einem Wert gleich dem Zeichenwert des Buchstabens modulo 32 repräsentiert |
\d |
Keine | Zeichenklassenescape, das Ziffern-Zeichen (0 bis 9) repräsentiert |
\f |
Keine | Zeichenescape, das U+000C (SEITENUMBRUCH) repräsentiert |
\k |
<, ein Bezeichner, dann > |
Ein namentlicher Rückverweis |
\n |
Keine | Zeichenescape, das U+000A (ZEILENVORSCHUB) repräsentiert |
\p |
{, eine Unicode-Eigenschaft und/oder Wert, dann } |
Unicode-Zeichenklassenescape, das Zeichen mit der angegebenen Unicode-Eigenschaft repräsentiert |
\q |
{, eine Zeichenfolge, dann } |
Nur gültig innerhalb von v-Modus Zeichenklassen; repräsentiert die Zeichenfolge, die wörtlich abgeglichen werden soll |
\r |
Keine | Zeichenescape, das U+000D (WAGENRÜCKLAUF) repräsentiert |
\s |
Keine | Zeichenklassenescape, das Leerzeichen-Zeichen repräsentiert |
\t |
Keine | Zeichenescape, das U+0009 (ZEICHENTABULATOR) repräsentiert |
\u |
4 hexadezimale Ziffern; oder {, 1 bis 6 hexadezimale Ziffern, dann } |
Zeichenescape, das das Zeichen mit dem gegebenen Codepunkt repräsentiert |
\v |
Keine | Zeichenescape, das U+000B (ZEILENTABULATOR) 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 |
\z |
Keine | Buffer Boundary Assertion |
\0 |
Keine | Zeichenescape, das U+0000 (NUL) repräsentiert |
\ gefolgt von 0 und einer weiteren Ziffer wird zu einer veralteten oktalen Escape-Sequenz, die im Unicode-bewussten Modus verboten ist. \ gefolgt von jeder anderen Ziffernfolge wird zu einem Rückverweis.
Darüber hinaus kann \ von einigen Nicht-Buchstaben- oder Zifferzeichen gefolgt werden, wobei die Escape-Sequenz immer ein Zeichenescape ist, das das entkommene Zeichen selbst darstellt:
\$,\(,\),\*,\+,\.,\/,\?,\[,\\,\],\^,\{,\|,\}: überall gültig\-: nur innerhalb von Zeichenklassen gültig\!,\#,\%,\&,\,,\:,\;,\<,\=,\>,\@,\`,\~: nur innerhalb vonv-Modus Zeichenklassen gültig
Die anderen ASCII Zeichen, nämlich Leerzeichen, ", ', _, und jeder nicht oben erwähnte Buchstabencharakter, sind keine gültigen Escape-Sequenzen. Im Unicode-unbewussten Modus werden Escape-Sequenzen, die nicht zu den oben genannten gehören, 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.