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 die Standard-PCRE-Syntax.

Sie arbeiten über ein spezielles RegExp- Objekt.

Darüber hinaus verfügen die Zeilen über eigene Methoden zum Suchen , Abgleichen und Ersetzen . Um sie jedoch zu verstehen, sollten Sie zuerst RegExp analysieren.

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 ein regulärer Ausdruck, nach dem gesucht werden muss (Ersetzung erfolgt später), und Flags bestehen aus einer beliebigen Kombination der Zeichen g (globale Suche), i (Groß- / Kleinschreibung beachten) und m (mehrzeilige Suche).

Die erste Methode wird oft angewendet, die zweite - manchmal. Beispielsweise sind zwei solcher Aufrufe gleichwertig:

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

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

// Ä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 Bedeutung
\ Für gewöhnliche Charaktere - macht sie zu etwas Besonderem. Beispielsweise sucht der Ausdruck / s / nur nach dem Zeichen 's'. Und wenn Sie \ vor s setzen, kennzeichnet \ \ s / bereits ein Leerzeichen, und umgekehrt, wenn es sich um ein spezielles Zeichen handelt, zum Beispiel *, dann ist es nur ein gewöhnlicher Stern. Zum Beispiel sucht / a * / nach 0 oder mehr aufeinanderfolgenden 'a'-Zeichen. Um ein mit einem Sternchen 'a *' versehenes zu finden, setzen Sie \ vor die Angabe. Symbol: / a \ * / .
^ Zeigt den Beginn der Eingabedaten an. Wenn das Suchflag für mehrere Zeilen gesetzt ist ("m") , funktioniert es auch, wenn eine neue Zeile gestartet wird. Beispielsweise findet / ^ A / "A" nicht in "A", sondern das erste "A" in "An A".
$ Zeigt das Ende der Eingabedaten an. Wenn das Suchflag für mehrere Zeilen gesetzt ist, funktioniert es auch am Ende der Zeile. Zum Beispiel findet / t $ / das 't' nicht im "Esser", sondern im "Essen".
* Zeigt die Wiederholung von 0 oder mehr Mal an. Zum Beispiel findet / bo * / "boooo" in "A ghost booooed" und "b" in "A bird warbled", findet aber nichts in "A goat grunted".
+ Zeigt die ein- oder mehrmalige Wiederholung an. Entspricht {1,} . Zum Beispiel findet / a + / 'a' in "candy" und alle 'a' in "caaaaaaandy".
? Gibt an, dass das Element möglicherweise vorhanden ist oder nicht. Zum Beispiel / e? Le? / Findet 'el' in "engel" und 'le' in "winkel". Wenn direkt nach einem der Quantifizierer * , + ,? , oder {} , wird eine nicht-gierige Suche eingestellt (wobei die minimal mögliche Anzahl bis zum nächsten Element des Musters wiederholt wird), im Gegensatz zum Standard-gierigen Modus, 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) bezieht sich auf ein beliebiges Zeichen außer Newline: \ n \ r \ u2028 oder \ u2029. (Mit [\ s \ S] können Sie nach beliebigen Zeichen suchen, einschließlich Zeilenumbrüchen.) Zum Beispiel findet /.n/ "ein" und "ein" in "nein, ein Apfel ist auf dem Baum", aber nicht "nein".
( x ) Findet x und merkt sich. Dies wird als "Speicher-Klammer" bezeichnet. Zum Beispiel findet / (foo) / 'foo' in der "foo bar" und merkt es sich. Die gefundene Teilzeichenfolge wird im Suchergebnis-Array oder in den vordefinierten Eigenschaften des RegExp-Objekts gespeichert: $ 1, ..., $ 9. Zusätzlich kombinieren Klammern das, was sich in ihnen befindet, zu einem einzigen Element des Musters. Zum Beispiel (abc) * - 0 oder mehrmaliges Wiederholen von abc.
(?: x ) Findet x , merkt sich aber nicht, was gefunden wurde. Dies wird als "nicht speicherbare Klammern" bezeichnet. Die gefundene Teilzeichenfolge wird nicht im Ergebnis-Array und in den RegExp-Eigenschaften gespeichert. Wie alle Klammern kombinieren sie die darin enthaltenen Zeichenfolgen zu einem einzelnen Teilmuster.
x (? = y ) Findet x nur, wenn x auf x folgt. Zum Beispiel findet / Jack (? = Sprat) / 'Jack' nur, wenn es von 'Sprat' gefolgt wird. / Jack (? = Sprat | Frost) / findet 'Jack' nur, wenn es von 'Sprat' oder 'Frost' gefolgt wird. Es wird jedoch weder "Sprotte" noch "Frost" in das Suchergebnis eingetragen.
x (?! y ) Findet x nur, wenn x nicht von y gefolgt wird. Zum Beispiel findet /\d+(?!\.)/ die Zahl nur, wenn kein Dezimalpunkt folgt. /\d+(?!\.)/.exec ("3.141") findet 141, jedoch nicht 3.141.
x | y Finde x oder y . Zum Beispiel findet / green | red / 'green' in "green apple" und 'red' in "red apple".
{ n } Wobei n eine positive ganze Zahl ist. Findet genau n Wiederholungen des vorhergehenden Elements. Zum Beispiel findet / a {2} / kein 'a' in "candy", sondern sowohl ein in "caaandy" als auch die ersten beiden ein in "caaandy".
{ n ,} Wobei n eine positive ganze Zahl ist. Findet n oder mehr Wiederholungen des Elements. Zum Beispiel findet / a {2} in "candy" kein "a", aber in "caaaaaandy" und "caaaaaandy" alle "a".
{ n , m } Wobei n und m positive ganze Zahlen sind. Finde von n bis m Wiederholungen des Elements.
[ xyz ] Zeichensatz Findet eines der aufgelisteten Zeichen. Sie können eine Lücke mit einem Bindestrich angeben. Beispielsweise ist [abcd] dasselbe wie [ad] . Findet 'b' im Bruststück sowie a und c im Schmerz.
[^ xyz ] Beliebige Zeichen außer den im Satz angegebenen. 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 Backspace-Zeichen. (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 / findet 'ly' in "möglicherweise gestern".
\ B Zeigt keine Wortgrenze an. Zum Beispiel findet / \ w \ Bn / 'on' in "noonday" und / y \ B \ w / findet 'ye' in "possible yesterday".
\ c X Wobei X der Buchstabe von A bis Z ist. Bezeichnet das Steuerzeichen in der Zeichenfolge. Zum Beispiel bezeichnet / \ cM / das Zeichen Strg-M.
\ d findet eine Ziffer aus einem beliebigen Alphabet (wir haben den gleichen Unicode). Verwenden Sie [0-9], um nur reguläre Zahlen zu finden. Beispielsweise findet / \ d / oder / [0-9] / '2' in "B2 ist die Suite-Nummer".
\ D Findet ein nicht numerisches Zeichen (alle Alphabete). [^ 0-9] - das Äquivalent für gewöhnliche Zahlen. Zum Beispiel findet / \ D / oder / [^ 0-9] / das 'B' in "B2 ist die Suite-Nummer".
\ f, \ r, \ n Die entsprechenden Sonderzeichen Form-Feed, Line-Feed, Line-Feed.
\ s Suchen Sie nach Leerzeichen, einschließlich Leerzeichen, Tabulatoren, Zeilenumbrüchen und anderen Unicode-Leerzeichen. Zum Beispiel findet / \ s \ w * / 'bar' in "foo bar".
\ S Finde alle Zeichen außer Leerzeichen. Zum Beispiel findet / \ S \ w * / 'foo' in "foo bar".
\ t Tabulatorzeichen.
\ v Vertikales Tabulatorzeichen.
\ w Suchen Sie alle 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 alle nicht (lat.) Wortsymbole. Entspricht [^ A-Za-z0-9_] . Zum Beispiel finden / \ W / und / [^ $ A-Za-z0-9 _] / das '%' in "50%".
\ n Dabei ist n eine ganze Zahl. Der Rückverweis auf die n-te Klammer speichert die Teilzeichenfolge. Beispielsweise findet / apple (,) \ sorange \ 1 / 'apple, orange' in 'apple, orange, cherry, peach. " Hinter der Tabelle befindet sich ein vollständigeres Beispiel.
\ 0 Suchen Sie das Nullzeichen. Fügen Sie am Ende keine weiteren Zahlen hinzu.
\ x hh Finde ein Zeichen mit dem hh- Code (2 hexadezimale Ziffern)
\ u hhhh Findet das Zeichen mit dem hhhh- Code (4 hexadezimale Ziffern).

Um einfach zu überprüfen, ob die Zeichenfolge für einen regulären Ausdruck geeignet ist, verwenden Sie die Testmethode :

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

Die exec- Methode gibt ein Array zurück und legt die Eigenschaften eines regulären Ausdrucks fest.
Wenn es keine Übereinstimmung gibt, wird null zurückgegeben.

Zum Beispiel

// Finde ein d, gefolgt von 1 oder mehr b, gefolgt von einem d
// Merke dir gefundenes b und nächstes d
// Unabhängige Suche registrieren
var myRe = / d (b +) (d) / ig;
var myArray = myRe.exec ("cdbBdbsbz");

Als Ergebnis des Skripts werden die folgenden Ergebnisse angezeigt:

Objekt Eigenschaft / Index Beschreibungen Beispiel
myArray Inhaltsverzeichnis myArray . ["dbBd", "bB", "d"]
Index Übereinstimmungsindex (von 0) 1
Eingabe Quelltext cdbBdbsbz
[0] Zuletzt übereinstimmende Zeichen dbBd
[1], ... [ n ] Gegebenenfalls Übereinstimmungen in geschachtelten Klammern. Die Anzahl der geschachtelten Klammern ist unbegrenzt. [1] = bB
[2] = d
myRe lastIndex Der Index, ab dem die nächste Suche gestartet werden soll. 5
ignoreCase Zeigt an, dass die Suche ohne Berücksichtigung der Groß- und Kleinschreibung aktiviert wurde, das " i " -Flag. wahr
global Zeigt an, dass das Übereinstimmungssuchflag " g " aktiviert wurde. wahr
mehrzeilig Zeigt an, ob das Suchflag " m " für mehrere Zeilen aktiviert wurde. falsch
Quelle Der Text des Musters. d (b +) (d)

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

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

Dieses Skript gibt den folgenden Text aus:

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

Im folgenden Beispiel sucht die Funktion nach Eingaben. Anschließend durchläuft es das Array, um festzustellen, ob es andere Namen gibt.

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 (Eingabe);
if (! firstName)
{
print (Eingabe + "ist kein Name!");
zurückkehren;
}

var count = 0;
für (var i = 0; i <A. Länge; i ++)
{
if (firstName [0] .toLowerCase () == A [i] .toLowerCase ())
count ++;
}
var midstring = (count == 1)? "Andere haben": "Andere haben";
print ("Danke", + count + midstring + "den gleichen Namen!")
}

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

Alle Methoden mit Ausnahme von replace können sowohl mit Objekten vom Typ regexp 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 dies manchmal praktisch und vollständig

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

Gibt den Index des regulären Ausdrucks in einer Zeichenfolge oder -1 zurück.

Wenn Sie wissen möchten, ob eine Zeichenfolge für einen regulären Ausdruck geeignet ist, verwenden Sie die Suchmethode (ähnlich den RegExp- Testmethoden ). Verwenden Sie für weitere Informationen die langsamere Übereinstimmungsmethode (ähnlich der RegExp exec- Methode).

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

Funktionstestinput (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 Flag g verfügt , gibt es dasselbe Ergebnis wie regexp.exec (string) zurück .

Wenn der reguläre Ausdruck das Flag g hat , wird ein Array mit allen Übereinstimmungen zurückgegeben.

Mit regexp.test (string) können Sie einfach herausfinden, ob der String mit dem regulären Ausdruck von regexp übereinstimmt .

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

Im folgenden Beispiel wird " Übereinstimmung" verwendet, um "Kapitel", gefolgt von einer oder mehreren Zahlen und dann durch einen Punkt getrennten Zahlen zu finden. In einem regulären Ausdruck gibt es ein i- Flag, sodass das Register ignoriert wird.

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

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

  • Kapitel 3.4.5.1 - Voll abgeglichene Linie
  • 3.4.5.1 - die erste Klammer
  • .1 - interne halterung

Das folgende Beispiel zeigt die Verwendung globaler Suchflags und Suchflags ohne Berücksichtigung der Groß- und Kleinschreibung 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 matches = str.match (regulärer Ausdruck);
document.write (Übereinstimmungen);
// meets = ['A', 'B', 'C', 'D', 'E', 'a', 'b', 'c', 'd', 'e']

Die Methode replace kann das Auftreten eines regulären Ausdrucks nicht nur durch einen String ersetzen, sondern auch durch das Ergebnis der Funktionsausführung. Die vollständige Syntax lautet:

var newString = str.replace (regexp / substr, newSubStr / function)
reguläre Ausdrücke
RegExp-Objekt. Seine Einträge werden durch den Wert ersetzt, der durch den Parameter Nummer 2 zurückgegeben wird
substr
Die Zeichenfolge, die durch newSubStr ersetzt werden soll .
newSubStr
Die Zeichenfolge, die die Teilzeichenfolge in Argument Nummer 1 ersetzt.
funktion
Die Funktion, die aufgerufen werden kann, um eine neue Teilzeichenfolge zu generieren (um die aus Argument 1 erhaltene Teilzeichenfolge zu ersetzen).

Die replace- Methode ändert nicht die Zeile, in der sie aufgerufen wurde, sondern gibt einfach eine neue, geänderte Zeile zurück.

Um eine globale Ersetzung vorzunehmen, 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.

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

Der Aufruf zum Ersetzen ließ die Zeichenfolge unverändert, da nicht nach einem regulären Ausdruck gesucht wurde, sondern nach der Zeichenfolge "\ s".

Die Ersatzzeichenfolge kann folgende Sonderzeichen enthalten:

Muster Einsätze
$$ Fügt "$" ein.
$ & Fügt den gefundenen Teilstring ein.
$ ` Fügt den Teil der Zeile vor dem gefundenen Eintrag ein.
$ ' Fügt den Teil der Zeile ein, der nach dem gefundenen Vorkommen kommt.
$ n oder $ nn Wenn n oder nn Dezimalstellen sind, wird die Teilzeichenfolge des in der n-ten geschachtelten Klammer gespeicherten Eintrags eingefügt, wenn das erste Argument ein RegExp-Objekt ist.

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

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

Der erste Parameter der Funktion ist der gefundene Teilstring. Wenn das erste Argument einer Ersetzung ein RegExp- Objekt ist, enthalten die folgenden n Parameter Übereinstimmungen aus den geschachtelten Klammern. Die letzten beiden Parameter sind die Position in der Zeile, an der der Zufall auftrat, und die Zeile selbst.

Der folgende zu ersetzende Aufruf gibt beispielsweise XXzzzz - XX, zzzz zurück.

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

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

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

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

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

Ausführlicher werden sie in dem Buch Beginning Regular Expressions beschrieben .