Reguläre Ausdrücke
Ein regulärer Ausdruck (regex abgekürzt) ermöglicht Entwicklern, Zeichenfolgen mit einem Muster abzugleichen, Teilinformationen zu extrahieren oder einfach zu testen, ob die Zeichenfolge dem Muster entspricht. Reguläre Ausdrücke werden in vielen Programmiersprachen verwendet, und die Syntax von JavaScript ist inspiriert von Perl.
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 (genannt eine Sprache) zu beschreiben. Ein regulärer Ausdruck benötigt in seinem Kern die folgenden Funktionen:
- Eine Menge von Zeichen, die in der Sprache verwendet werden können, das sogenannte Alphabet.
- Konkatenation:
ab
bedeutet "das Zeichena
gefolgt von dem Zeichenb
". - Vereinigung:
a|b
bedeutet "entwedera
oderb
". - Kleene-Stern:
a*
bedeutet "null oder mehra
Zeichen".
Unter der Annahme eines endlichen Alphabets (wie die 26 Buchstaben des englischen Alphabets oder das gesamte Unicode-Zeichenset) können alle regulären Sprachen durch die oben genannten Funktionen 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 tatsächlich nicht regulär, aufgrund der Existenz von Rückverweisen (reguläre Ausdrücke müssen endliche Zustände haben). Sie sind jedoch immer noch eine sehr nützliche Funktion.
Erstellen 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");
Sie haben zur Laufzeit keine Unterschiede, obwohl sie Auswirkungen auf die Leistung, statische Analysierbarkeit und Autorenergonomie bei der Escape-Zeichenverwendung haben können. Für weitere Informationen siehe die RegExp
-Referenz.
Regex-Flags
Flags sind spezielle Parameter, die die Art und Weise ändern können, wie ein regulärer Ausdruck interpretiert oder wie er mit dem Eingabetext interagiert. Jedes Flag entspricht einer Zugriffseigenschaft auf dem RegExp
-Objekt.
Flag | Beschreibung | Entsprechende Eigenschaft |
---|---|---|
d |
Erzeugt Indizes für Teilzeichenfolgenübereinstimmungen. | hasIndices |
g |
Globale Suche. | global |
i |
Groß-/Kleinschreibung ignorieren. | ignoreCase |
m |
Lässt ^ und $ den Anfang und das Ende jeder Zeile statt des gesamten Strings abgleichen. |
multiline |
s |
Erlaubt . zum Abgleich von Zeilenumbruchzeichen. |
dotAll |
u |
"Unicode"; behandelt ein Muster als eine Sequenz von Unicode-Codepunkten. | unicode |
v |
Ein Upgrade zum u -Modus mit mehr Unicode-Funktionen. |
unicodeSets |
y |
Führt eine "sticky" Suche durch, die beim aktuellen Index der Zielzeichenkette startet. | sticky |
Die i
, m
und s
Flags können für bestimmte Teile eines Regex mithilfe der Modifier-Syntax aktiviert oder deaktiviert werden.
Die folgenden Abschnitte listen alle verfügbaren Regex-Syntaxen auf, gruppiert nach ihrer syntaktischen Natur.
Assertionen
Assertionen sind Konstrukte, die testen, ob die Zeichenfolge an der angegebenen Position eine bestimmte Bedingung erfüllt, jedoch keine Zeichen konsumieren. Assertionen können nicht quantifiziert werden.
- Eingangsgrenzen-Assertion:
^
,$
-
Behauptet, 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:
(?=...)
,(?!...)
-
Behauptet, dass die aktuelle Position von einem bestimmten Muster gefolgt oder nicht gefolgt wird.
- Lookbehind-Assertion:
(?<=...)
,(?<!...)
-
Behauptet, dass die aktuelle Position von einem bestimmten Muster vorangegangen oder nicht vorangegangen wird.
- Wortgrenzen-Assertion:
\b
,\B
-
Behauptet, 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 scheitert entweder an der Übereinstimmung oder erlaubt dem Muster, mit dem nächsten Atom weiter zu übereinstimmen.
- Rückverweis:
\1
,\2
-
Passt auf ein zuvor durch eine Gruppe erfasstes Untermuster.
- Erfassungsgruppe:
(...)
-
Passt auf ein Untermuster und merkt sich Informationen über die Übereinstimmung.
- Zeichenklasse:
[...]
,[^...]
-
Passt auf jedes Zeichen innerhalb oder außerhalb einer Zeichengruppe. Wenn das
v
-Flag aktiviert ist, kann es auch auf Zeichenfolgen mit endlicher Länge angewendet werden. - Zeichenklassen-Flucht:
\d
,\D
,\w
,\W
,\s
,\S
-
Passt auf jedes Zeichen innerhalb oder außerhalb einer vordefinierten Zeichengruppe.
- Zeichen-Flucht:
\n
,\u{...}
-
Passt auf ein Zeichen, das möglicherweise nicht bequem in seiner literalen Form dargestellt werden kann.
- Wörtliches Zeichen:
a
,b
-
Passt auf ein bestimmtes Zeichen.
- Modifier:
(?ims-ims:...)
-
Übersteuert die Flageinstellungen in einem bestimmten Teil eines regulären Ausdrucks.
- Benannter Rückverweis:
\k<name>
-
Passt auf ein zuvor durch eine benannte Gruppe erfasstes Untermuster.
- Benannte Erfassungsgruppe:
(?<name>...)
-
Passt auf ein Untermuster und merkt sich Informationen über die Übereinstimmung. Die Gruppe kann später durch einen benutzerdefinierten Namen anstelle ihres Indexes im Muster identifiziert werden.
- Nicht-erfassende Gruppe:
(?:...)
-
Passt auf ein Untermuster, ohne Informationen über die Übereinstimmung zu merken.
- Unicode-Zeichenklassen-Flucht:
\p{...}
,\P{...}
-
Passt auf eine Gruppe von Zeichen, die durch eine Unicode-Eigenschaft angegeben sind. Wenn das
v
-Flag aktiviert ist, kann es auch auf Zeichenfolgen mit endlicher Länge angewendet werden. - Wildcard:
.
-
Passt auf jedes Zeichen außer Zeilenbegrenzern, es sei denn, das
s
-Flag ist gesetzt.
Andere Funktionen
Diese Funktionen legen selbst keine Muster fest, werden jedoch verwendet, um Muster zu komponieren.
- Disjunktion:
|
-
Passt auf eines von mehreren durch das
|
-Zeichen getrennten Alternativen. - Quantor:
*
,+
,?
,{n}
,{n,}
,{n,m}
-
Passt ein Atom eine bestimmte Anzahl von Malen.
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 je nach Folgezustand von \
sehr unterschiedliche Zwecke erfüllen. Im Folgenden finden Sie eine Liste aller gültigen "Escape-Sequenzen":
Escape-Sequenz | Gefolgt von | Bedeutung |
---|---|---|
\B |
Keine | Nicht-Wort-Grenze-Assertion |
\D |
Keine | Zeichenklassen-Flucht, die Nicht-Ziffern-Zeichen repräsentiert |
\P |
{ , eine Unicode-Eigenschaft und/oder Wert, dann } |
Unicode-Zeichenklassen-Flucht, die Zeichen ohne die angegebene Unicode-Eigenschaft repräsentiert |
\S |
Keine | Zeichenklassen-Flucht, die Nicht-Leerzeichen-Zeichen repräsentiert |
\W |
Keine | Zeichenklassen-Flucht, die Nicht-Wort-Zeichen repräsentiert |
\b |
Keine | Wort-Grenze-Assertion; innerhalb Zeichenklassen repräsentiert U+0008 (RÜCKSCHRITT) |
\c |
Ein Buchstabe von A bis Z oder a bis z |
Eine Zeichen-Flucht, die das Steuerzeichen mit einem Wert gleich dem Zeichenwert des Buchstabens modulo 32 repräsentiert |
\d |
Keine | Zeichenklassen-Flucht, die Ziffernzeichen (0 bis 9 ) repräsentiert |
\f |
Keine | Zeichen-Flucht, die U+000C (FORMULAR-VORSCHUB) repräsentiert |
\k |
< , ein Bezeichner, dann > |
Ein benannter Rückverweis |
\n |
Keine | Zeichen-Flucht, die U+000A (LINE FEED) repräsentiert |
\p |
{ , eine Unicode-Eigenschaft und/oder Wert, dann } |
Unicode-Zeichenklassen-Flucht, die Zeichen mit der angegebenen Unicode-Eigenschaft repräsentiert |
\q |
{ , eine Zeichenfolge, dann ein } |
Nur gültig innerhalb v -Modus-Zeichenklassen; repräsentiert die Zeichenfolge, die wörtlich übereinstimmt |
\r |
Keine | Zeichen-Flucht, die U+000D (CARRIAGE RETURN) repräsentiert |
\s |
Keine | Zeichenklassen-Flucht, die Whitespace-Zeichen repräsentiert |
\t |
Keine | Zeichen-Flucht, die U+0009 (CHARACTERTABULATUR) repräsentiert |
\u |
4 hexadezimale Ziffern; oder { , 1 bis 6 hexadezimale Ziffern, dann } |
Zeichen-Flucht, die das Zeichen mit dem angegebenen Codepunkt repräsentiert |
\v |
Keine | Zeichen-Flucht, die U+000B (LINIEN-TABULATUR) repräsentiert |
\w |
Keine | Zeichenklassen-Flucht, die Wort-Zeichen (A bis Z , a bis z , 0 bis 9 , _ ) repräsentiert |
\x |
2 hexadezimale Ziffern | Zeichen-Flucht, die das Zeichen mit dem angegebenen Wert repräsentiert |
\0 |
Keine | Zeichen-Flucht, die U+0000 (NUL) repräsentiert |
\
gefolgt von 0
und einer anderen Ziffer wird zu einer veralteten oktalen Escape-Sequenz, die in Unicode-bewusstem Modus verboten ist. \
gefolgt von einer beliebigen anderen Ziffernsequenz wird zu einem Rückverweis.
Darüber hinaus kann \
von einigen nicht-Buchstaben-oder-Ziffern-Zeichen gefolgt werden, in diesem Fall ist die Escape-Sequenz immer eine Zeichen-Flucht, die das entkommene Zeichen selbst darstellt:
\$
,\(
,\)
,\*
,\+
,\.
,\/
,\?
,\[
,\\
,\]
,\^
,\{
,\|
,\}
: überall gültig\-
: nur innerhalb Zeichenklassen gültig\!
,\#
,\%
,\&
,\,
,\:
,\;
,\<
,\=
,\>
,\@
,\`
,\~
: nur innerhalbv
-Modus-Zeichenklassen gültig
Die anderen ASCII Zeichen, nämlich Leerzeichen, "
, '
, _
und jeder Buchstabe, der oben nicht erwähnt wurde, sind keine gültigen Escape-Sequenzen. Im Unicode-unbewussten Modus werden Escape-Sequenzen, die nicht eine der obigen sind, zu Identitäts-Escapes: sie repräsentieren das Zeichen, das dem Backslash folgt. Zum Beispiel repräsentiert \a
das Zeichen a
. Dieses Verhalten beschränkt die Fähigkeit, neue Escape-Sequenzen einzuführen, ohne Kompatibilitätsprobleme rückwärts zu verursachen, und ist daher im Unicode-bewussten Modus verboten.