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 Zeichena
gefolgt von dem Zeichenb
". - Vereinigung:
a|b
bedeutet "entwedera
oderb
". - Kleene-Stern:
a*
bedeutet "null oder mehra
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:
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, 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 vonv
-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
Browser-Kompatibilität
BCD tables only load in the browser