This page has been robot translated, sorry for typos if any. Original content here.

Reguläre Ausdrücke und Sonderzeichen

Reguläre Ausdrücke in Javascript haben eine spezielle Kurzform und Standard-PCRE-Syntax.

Sie arbeiten mit einem speziellen RegExp- Objekt.

Darüber hinaus haben Zeichenfolgen ihre eigenen Such- , Übereinstimmungs- und Ersetzungsmethoden. Um sie zu verstehen, werden wir zunächst RegExp untersuchen.

Ein Objekt vom Typ RegExp oder kurz ein regulärer Ausdruck kann auf zwei Arten erstellt werden

/ pattern / flags
neues RegExp ("Muster" [, Flags])

Muster ist der reguläre Ausdruck, nach dem gesucht werden soll (später über das Ersetzen), und die Flags sind Zeichenfolgen aus einer beliebigen Kombination von Zeichen g (globale Suche), i (ohne Berücksichtigung der Groß- und Kleinschreibung) und m (mehrzeilige Suche).

Die erste Methode wird oft angewendet, die zweite - manchmal. Zum Beispiel sind zwei solcher Anrufe gleichwertig:

var reg = / ab + c / i
var reg = new RegExp ("ab + c", "i")

Beim zweiten Aufruf - da der reguläre Ausdruck in Anführungszeichen steht, müssen Sie \ duplizieren

// äquivalent
re = new RegExp ("\\ w +")
re = / \ w + /

Bei der Suche können Sie die meisten Funktionen der modernen PCRE-Syntax verwenden.

Tabelle reduzieren / erweitern

Symbol Wert
\. Für gewöhnliche Charaktere - macht sie zu etwas Besonderem. Zum Beispiel sucht der Ausdruck / s / einfach nach dem Zeichen 's'. Und wenn Sie \ vor s setzen, bezeichnet / \ s / bereits ein Leerzeichen. Und umgekehrt, wenn das Zeichen etwas Besonderes ist, zum Beispiel *, dann macht \ es nur zu einem gewöhnlichen Sternchen. Zum Beispiel sucht / a * / nach 0 oder mehr aufeinanderfolgenden 'a'-Zeichen. Um ein mit einem Sternchen 'a *' zu finden, setzen Sie \ vor die Spezifikation. Symbol: / a \ * / .
^ Zeigt den Beginn der Eingabe an. Wenn das mehrzeilige Suchflag ("m") gesetzt ist , funktioniert es auch beim Starten einer neuen Zeile. Beispielsweise findet / ^ A / nicht "A" in "an A", sondern das erste "A" in "An A".
$ Zeigt das Ende der Eingabe an. Wenn das mehrzeilige Suchflag gesetzt ist, funktioniert es auch am Ende der Zeile. Beispielsweise findet / t $ / 't' nicht in "eater", sondern in "eat".
* * Stellt eine Wiederholung von 0 oder mehr Mal dar. Zum Beispiel findet / bo * / 'boooo' in "A ghost booooed" und 'b' in "A bird warbled", findet aber nichts in "A goat grunted".
+ Stellt eine Wiederholung von 1 oder mehr Mal dar. Entspricht {1,} . Zum Beispiel findet / a + / 'a' in "Süßigkeiten" und alle 'a' in "caaaaaaandy".
? Zeigt an, dass ein Element vorhanden oder nicht vorhanden sein kann. Zum Beispiel / e? Le? / Findet 'el' in "Engel" und 'le' in "Winkel". Wenn unmittelbar nach einem der Quantifizierer * , + ,? , oder {} , setzt dann die Suche "nicht gierig" (so oft wie möglich bis zum nächsten Element des Musters wiederholen) im Gegensatz zum Standardmodus "gierig", in dem die Anzahl der Wiederholungen maximal ist, auch wenn das nächste Element des Musters ebenfalls geeignet ist ,? wird in der Vorschau verwendet, die in der Tabelle unter (? =) , (?!) und (? :) beschrieben ist .
. (Dezimalpunkt) bezeichnet ein beliebiges Zeichen mit Ausnahme des Zeilenvorschubs: \ n \ r \ u2028 oder \ u2029. (Mit [\ s \ S] können Sie nach beliebigen Zeichen suchen, einschließlich Zeilenvorschüben.) Zum Beispiel findet /.n/ 'ein' und 'ein' in "nein, ein Apfel ist auf dem Baum", aber nicht 'nein'.
( x ) Findet x und erinnert sich. Dies wird als "Klammer" bezeichnet. Zum Beispiel wird / (foo) / 'foo' in "foo bar" finden und sich daran erinnern. Die gefundene Teilzeichenfolge wird im Suchergebnisarray oder in den vordefinierten Eigenschaften des RegExp-Objekts gespeichert: $ 1, ..., $ 9. Außerdem kombinieren die Klammern das, was sich in ihnen befindet, zu einem einzigen Element des Musters. Zum Beispiel (abc) * - Wiederholung von abc 0 oder mehrmals.
(?: x ) Findet x , erinnert sich aber nicht, was gefunden wurde. Dies wird als "nicht aufgezeichnete Klammern" bezeichnet. Die gefundene Teilzeichenfolge wird nicht im Array von Ergebnissen und RegExp-Eigenschaften gespeichert. Wie alle Klammern kombinieren sie das, was in ihnen enthalten ist, zu einem einzigen Untermuster.
x (? = y ) Findet x nur, wenn auf x y folgt. Zum Beispiel findet / Jack (? = Sprat) / 'Jack' nur, wenn ihm 'Sprat' folgt. / Jack (? = Sprat | Frost) / findet 'Jack' nur, wenn 'Sprat' oder 'Frost' folgt. Das Suchergebnis enthält jedoch weder "Sprat" noch "Frost".
x (?! y ) Findet x nur, wenn x nicht von y gefolgt wird. Zum Beispiel findet /\d+(?!\.)/ nur dann eine Zahl, wenn kein Dezimalpunkt folgt. /\d+(?!\.)/.exec("3.141 ") findet 141, aber nicht 3.141.
x | y Findet x oder y . Zum Beispiel findet / green | red / "grün" in "grüner Apfel" und "rot" in "roter Apfel".
{ n } Wobei n eine positive ganze Zahl ist. Findet genau n Wiederholungen des vorherigen Elements. Zum Beispiel findet / a {2} / kein "a" in "Süßigkeiten", sondern sowohl ein "in" caandy "als auch die ersten beiden a in" caaandy ".
{ n ,} Wobei n eine positive ganze Zahl ist. Findet n oder mehr Wiederholungen eines Elements. Zum Beispiel findet / a {2,} nicht "a" in "Süßigkeiten", sondern alle "a" in "caandy" und in "caaaaaaandy".
{ n , m } Wobei n und m positive ganze Zahlen sind. Finden Sie n bis m Wiederholungen eines Elements.
[ xyz ] Zeichensatz. Findet eines der aufgelisteten Zeichen. Sie können die Lücke mit einem Bindestrich angeben. Zum Beispiel ist [abcd] dasselbe wie [ad] . Findet 'b' in Bruststück sowie 'a' und 'c' in Schmerz.
[^ xyz ] Alle anderen als die im Satz angegebenen Zeichen. Sie können auch eine Lücke angeben. Zum Beispiel ist [^ abc] dasselbe wie [^ ac] . Findet 'r' in "Bruststück" und 'h' in "hacken".
[\ b] Findet das Rücktastezeichen. (Nicht zu verwechseln mit \ b .)
\ b Findet die Grenze von Wörtern (lateinisch), zum Beispiel ein Leerzeichen. (Nicht zu verwechseln mit [\ b] ). Zum Beispiel findet / \ bn \ w / 'no' in "noonday"; / \ wy \ b / wird 'ly' in "möglicherweise gestern" finden.
\ B. Zeigt keine Wortgrenze an. Zum Beispiel findet / \ w \ Bn / 'on' in "noonday" und / y \ B \ w / findet 'ye' in "evtl. gestern".
\ c X. Wobei X ein Buchstabe von A bis Z ist. Gibt das Steuerzeichen in der Zeichenfolge an. Zum Beispiel bezeichnet / \ cM / das Strg-M-Zeichen.
\ d findet eine Ziffer aus einem beliebigen Alphabet (wir haben Unicode). Verwenden Sie [0-9], um nur reguläre Zahlen zu finden. Zum Beispiel findet / \ d / oder / [0-9] / '2' in "B2 ist die Suite-Nummer".
\ D. Suchen Sie ein nicht digitales Zeichen (alle Alphabete). [^ 0-9] entspricht äquivalenten Ziffern. Zum Beispiel findet / \ D / oder / [^ 0-9] / 'B' in "B2 ist die Suite-Nummer".
\ f, \ r, \ n Entsprechende Sonderzeichen Form-Feed, Zeilenvorschub, Zeilenvorschub.
\ s Suchen Sie nach Leerzeichen, einschließlich Leerzeichen, Tabulatoren, Zeilenvorschüben und anderen Unicode-Leerzeichen. Zum Beispiel findet / \ s \ w * / 'bar' in "foo bar".
\ S. Finde ein beliebiges Zeichen außer Leerzeichen. Zum Beispiel findet / \ S \ w * / 'foo' in "foo bar".
\ t Tabulatorzeichen.
\ v Ein vertikales Tabulatorzeichen.
\ w Suchen Sie nach verbalen Zeichen (lateinisches Alphabet), einschließlich Buchstaben, Zahlen und Unterstrichen. Entspricht [A-Za-z0-9_] . Zum Beispiel findet / \ w / 'a' in "apple", '5' in "$ 5.28" und '3' in "3D".
\ W. Finden Sie ein nicht (lat.) Verbales Zeichen. Entspricht [^ A-Za-z0-9_] . Zum Beispiel finden / \ W / und / [^ $ A-Za-z0-9 _] / '%' in "50%".
\ n Dabei ist n eine ganze Zahl. Link zurück zum n-ten in Klammern gesetzten Teilstring. Zum Beispiel findet / apple (,) \ sorange \ 1 / 'apple, orange' in "apple, orange, cherry, peach.". Hinter dem Tisch befindet sich ein vollständigeres Beispiel.
\ 0 Finde den NUL-Charakter. Fügen Sie am Ende keine weiteren Zahlen hinzu.
\ x hh Suchen Sie das Zeichen mit dem hh- Code (2 hexadezimale Ziffern).
\ u hhhh Suchen Sie das Zeichen mit dem Code hhhh (4 hexadezimale Ziffern).

Um einfach zu überprüfen, ob eine Zeichenfolge mit einem regulären Ausdruck übereinstimmt, wird die folgende Testmethode verwendet:

if (/\s/.test("line ")) {
... Es gibt Leerzeichen in der Zeile! ...
}}

Die exec- Methode gibt ein Array zurück und legt die Eigenschaften des regulären Ausdrucks fest.
Wenn keine Übereinstimmungen vorhanden sind, wird null zurückgegeben.

Zum Beispiel

// Finde ein d, gefolgt von 1 oder mehr b, gefolgt von einem d
// Erinnere dich an das gefundene b und das nächste d
// Suche ohne Berücksichtigung der Groß- und Kleinschreibung
var myRe = / d (b +) (d) / ig;
var myArray = myRe.exec ("cdbBdbsbz");

Als Ergebnis des Skripts werden folgende Ergebnisse erzielt:

Objekt Eigentum / Index Beschreibungen Beispiel
myArray Der Inhalt von myArray . ["dbBd", "bB", "d"]
Index Übereinstimmungsindex (von 0) 1
Eingabe Quellzeichenfolge cdbBdbsbz
[0] Letzte übereinstimmende Zeichen dbBd
[1], ... [ n ] Gegebenenfalls Übereinstimmungen in Klammern. Die Anzahl der Klammern ist nicht begrenzt. [1] = bB
[2] = d
myRe lastIndex Der Index, von dem aus die nächste Suche gestartet werden soll. 5
ignoreCase Zeigt an, dass die Suche ohne Berücksichtigung der Groß- und Kleinschreibung aktiviert wurde. Markieren Sie " i ". wahr
global Zeigt an, dass das Flag " g " aktiviert wurde, um nach allen Übereinstimmungen zu suchen. wahr
mehrzeilig Gibt an, ob das mehrzeilige Suchflag " m " aktiviert wurde. falsch
Quelle Der Text des Musters. d (b +) (d)

Wenn das Flag " g " in einem regulären Ausdruck aktiviert ist, können Sie die exec- Methode mehrmals aufrufen, um aufeinanderfolgende Übereinstimmungen in derselben Zeile zu finden. Wenn Sie dies tun, beginnt die Suche in der Teilzeichenfolge str mit dem Index lastIndex . Hier ist zum Beispiel ein Skript:

var myRe = / ab * / g;
var str = "abbcdefabh";
while ((myArray = myRe.exec (str))! = null) {
var msg = "Gefunden" + myArray [0] + ".";
msg + = "Das nächste Spiel beginnt um" + myRe.lastIndex;
print (msg);
}}

Dieses Skript gibt den folgenden Text aus:

Gefunden abb. Das nächste Spiel beginnt um 3 Uhr
Gefunden ab. Das nächste Spiel beginnt um 9 Uhr

Im folgenden Beispiel sucht die Funktion nach Eingaben. Durchlaufen Sie dann das Array, um festzustellen, ob andere Namen vorhanden sind.

Es wird angenommen, dass sich alle registrierten Namen in Array A befinden:

var A = ["Frank", "Emily", "Jane", "Harry", "Nick", "Beth", "Rick",
"Terrence", "Carol", "Ann", "Terry", "Frank", "Alice", "Rick",
"Bill", "Tom", "Fiona", "Jane", "William", "Joan", "Beth"];

Funktionssuche (Eingabe)
{
var firstName = /\w+/i.exec(input);
if (! firstName)
{
print (Eingabe + "ist kein Name!");
zurück
}}

var count = 0;
für (var i = 0; i <A.Länge; i ++)
{
if (Vorname [0] .toLowerCase () == A [i] .toLowerCase ())
count ++;
}}
var midstring = (count == 1)? "andere haben": "andere haben";
print ("Danke" + count + midstring + "der gleiche Name!")
}}

Die folgenden Methoden arbeiten mit regulären Ausdrücken aus Zeichenfolgen.

Alle Methoden außer Ersetzen können sowohl mit Objekten vom Typ regulärer Ausdruck in Argumenten als auch mit Zeichenfolgen aufgerufen werden, die automatisch in RegExp-Objekte konvertiert werden.

Die Anrufe sind also gleichwertig:

var i = str.search (/ \ s /) var i = str.search ("\\ s")

Wenn Sie Anführungszeichen verwenden, müssen Sie \ duplizieren, und es gibt keine Möglichkeit, Flags anzugeben. Daher ist manchmal auch das vollständige Formular praktisch

var i = str.search (neues RegExp ("\\ s", "g"))

Gibt den Index für reguläre Ausdrücke in einer Zeichenfolge oder -1 zurück.

Wenn Sie wissen möchten, ob eine Zeichenfolge mit einem regulären Ausdruck übereinstimmt, verwenden Sie die Suchmethode (ähnlich den RegExp- Testmethoden ). Verwenden Sie für weitere Informationen die langsamere Übereinstimmungsmethode (ähnlich wie bei RegExp exec ).

In diesem Beispiel wird eine Meldung angezeigt, je nachdem, ob die Zeichenfolge mit dem regulären Ausdruck übereinstimmt.

Funktionstesteingang (re, str) {
if (str.search (re)! = -1)
midstring = "enthält";
sonst
midstring = "enthält nicht";
document.write (str + midstring + re.source);
}}

Wenn regexp nicht über das g- Flag verfügt, wird das gleiche Ergebnis wie regexp.exec (Zeichenfolge) zurückgegeben .

Wenn regexp das g- Flag hat, gibt es ein Array mit allen Übereinstimmungen zurück.

Verwenden Sie regexp.test (Zeichenfolge) , um einfach herauszufinden, ob eine Zeichenfolge mit dem regulären Ausdruck regexp übereinstimmt .

Wenn Sie das erste Ergebnis erhalten möchten, versuchen Sie es mit r egexp.exec (Zeichenfolge) .

Im folgenden Beispiel wird die Übereinstimmung verwendet, um "Kapitel" gefolgt von einer oder mehreren Ziffern und dann durch einen Punkt getrennten Zahlen zu finden. Der reguläre Ausdruck enthält ein i- Flag, sodass der Fall ignoriert wird.

str = "Weitere Informationen finden Sie in Kapitel 3.4.5.1";
re = / Kapitel (\ d + (\. \ d) *) / i;
gefunden = str.match (re);
Alarm (gefunden);

Das Skript gibt eine Reihe von Übereinstimmungen zurück:

  • Kapitel 3.4.5.1 - eine vollständig übereinstimmende Linie
  • 3.4.5.1 - erste Klammer
  • .1 - innere Halterung

Das folgende Beispiel zeigt die Verwendung globaler und von Groß- und Kleinschreibung nicht unterscheidender Suchflags mit Übereinstimmung . Alle Buchstaben von A bis E und von a bis e befinden sich jeweils in einem separaten Element des Arrays.

var str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
var regexp = / [AE] / gi;
var match = str.match (regulärer Ausdruck);
document.write (Übereinstimmungen);
// Übereinstimmungen = ['A', 'B', 'C', 'D', 'E', 'a', 'b', 'c', 'd', 'e']

Die Ersetzungsmethode kann das Auftreten eines regulären Ausdrucks nicht nur durch eine Zeichenfolge, sondern auch durch das Ergebnis der Funktionsausführung ersetzen. Die vollständige Syntax lautet:

var newString = str.replace (regexp / substr, newSubStr / function)
Regexp
RegExp-Objekt. Seine Vorkommen werden durch den Wert ersetzt, den Parameter Nummer 2 zurückgibt
substr
Die Zeichenfolge, die durch newSubStr ersetzt werden soll .
newSubStr
Eine Zeichenfolge, die die Teilzeichenfolge von Argument 1 ersetzt.
Funktion
Eine Funktion, die aufgerufen werden kann, um einen neuen Teilstring zu generieren (um den aus Argument 1 erhaltenen Teilstring zu ersetzen).

Die Ersetzungsmethode ändert nicht die Zeile, in der sie aufgerufen wird, sondern gibt einfach eine neue, geänderte Zeile zurück.

Um eine globale Ersetzung durchzuführen, fügen Sie das Flag "g" in den regulären Ausdruck ein.

Wenn das erste Argument eine Zeichenfolge ist, wird es nicht in einen regulären Ausdruck konvertiert, z. B.

var ab = "ab" .replace ("\\ s", "..") // = "ab"

Der Ersetzungsaufruf ließ die Zeile unverändert, da nicht nach dem regulären Ausdruck \ s gesucht wurde, sondern nach der Zeichenfolge "\ s".

Die Ersatzzeichenfolge kann folgende Sonderzeichen enthalten:

Muster Beilagen
$$ Fügt "$" ein.
$ & Fügt den gefundenen Teilstring ein.
$ ` Fügt den Teil der Zeile ein, der vor dem gefundenen Eintrag steht.
$ ' Fügt den Teil der Zeile ein, der nach dem gefundenen Eintrag kommt.
$ n oder $ nn Wenn n oder nn Dezimalstellen sind, wird der Teilstring des Auftretens eingefügt, an den sich die n- te Klammer erinnert, wenn das erste Argument ein RegExp-Objekt ist.

Wenn Sie eine Funktion als zweiten Parameter angeben, wird sie bei jeder Übereinstimmung ausgeführt.

In einer Funktion können Sie dynamisch eine Ersetzungszeichenfolge generieren und zurückgeben.

Der erste Parameter der Funktion ist der gefundene Teilstring. Wenn das erste zu ersetzende Argument ein RegExp- Objekt ist, enthalten die nächsten n Parameter Übereinstimmungen aus verschachtelten Klammern. Die letzten beiden Parameter sind die Position in der Zeile, an der die Übereinstimmung stattgefunden hat, und die Zeile selbst.

Beispielsweise gibt der nächste zu ersetzende Aufruf XXzzzz - XX, zzzz zurück.

Funktionsaustauscher (str, p1, p2, Offset, s)
{
return str + "-" + p1 + "," + p2;
}}
var newString = "XXzzzz" .replace (/ (X *) (z *) /, Ersetzer)

Wie Sie sehen können, enthält der reguläre Ausdruck zwei Klammern, und daher enthält die Funktion zwei Parameter p1 , p2 .
Wenn es drei Klammern gäbe, müsste der Funktion der Parameter p3 hinzugefügt werden.

Die folgende Funktion ersetzt Wörter vom Typ borderTop durch border-top :

Funktion styleHyphenFormat (propertyName)
{
Funktion UpperToHyphenLower (Übereinstimmung)
{
return '-' + match.toLowerCase ();
}}
return propertyName.replace (/ [AZ] /, UpperToHyphenLower);
}}

Für ein allgemeines Verständnis der regulären Ausdrücke können Sie den Artikel auf Wikipedia lesen.

Sie werden ausführlicher in dem Buch (English) Beginning Regular Expressions beschrieben .