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

Sie arbeiten durch ein spezielles Objekt RegExp .

Zusätzlich haben die Strings ihre eigenen Methoden search , match , replace , aber um sie zu verstehen, analysieren wir zuerst RegExp .

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

/ Muster / Flaggen
neue RegExp ("pattern" [, flags])

Muster ist ein regulärer Ausdruck für die Suche (über den Austausch später), und Flags sind eine Zeichenfolge aus einer beliebigen Kombination von Zeichen g (globale Suche), i (Fall unbedeutend) und m (mehrzeilige Suche).

Die erste Methode wird häufig verwendet, die zweite Methode manchmal. Zum Beispiel sind zwei solcher Anrufe gleichwertig:

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

Beim zweiten Aufruf - weil der reguläre Ausdruck in Anführungszeichen \ dupliziert \

// sind gleichwertig
re = new RegExp ("\\ w +")
re = / \ w + /

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

Tabelle minimieren / erweitern

Symbol Bedeutung
\ Für gewöhnliche Charaktere - macht sie besonders. Zum Beispiel sucht der Ausdruck / s / nur nach dem Zeichen 's'. Und wenn Sie \ vor s setzen, dann bezeichnet \ \ s / bereits ein Leerzeichen, umgekehrt, wenn es sich um ein Sonderzeichen handelt, zum Beispiel *, dann wird \ nur das übliche "Stern" -Zeichen bilden. Zum Beispiel sucht / a * / nach 0 oder mehr aufeinanderfolgenden Zeichen "a". Um ein mit dem Stern 'a *' zu finden - setzen Sie \ vor spets. mit dem Symbol: / a \ * / .
^ Zeigt den Anfang der Eingabedaten an. Wenn das Flag für die mehrzeilige Suche ("m") gesetzt ist , funktioniert es auch, wenn eine neue Zeile beginnt. Zum Beispiel findet / ^ A / "A" nicht in "an A", sondern findet das erste "A" in "An A."
$ Zeigt das Ende der Eingabedaten an. Wenn das Flag für die mehrzeilige Suche gesetzt ist, funktioniert es auch am Ende der Zeile, zum Beispiel findet / t $ / im "esater" kein "t", findet es aber in "eat".
* Zeigt eine Wiederholung von 0 oder mehrmals an. Zum Beispiel wird / bo * / "boooo" in "A ghost booooed" und "b" in "A bird travers" finden, aber in "A goat grunted" nichts finden.
+ Zeigt eine Wiederholung von 1 oder mehrmals an. Es ist äquivalent zu {1,} . Zum Beispiel findet / a + / "a" in "candy" und alle "a" in "caaaaaaaandy".
? Zeigt an, dass das Objekt möglicherweise nicht vorhanden ist. Zum Beispiel wird / e? Le? / "El" in "engel" und "le" in "angle" finden. Wird es unmittelbar nach einem der Quantifizierer * , + ,? , oder {} , spezifiziert "nicht-gierige" Suche (die Wiederholung ist die minimal mögliche Anzahl, bis zum nächsten nächsten Musterelement), im Gegensatz zum "gierigen" Standardmodus, in dem die Anzahl der Wiederholungen maximal ist, auch wenn das nächste Musterelement auch passt. ,? wird in der Vorschau verwendet, die in der Tabelle unter (? =) , (?!) und (? :) beschrieben wird .
. (Dezimalpunkt) bedeutet ein beliebiges Zeichen außer dem Zeilenvorschub: \ n \ r \ u2028 oder \ u2029. ( Sie können mit [\ s \ S] nach einem beliebigen Zeichen suchen, einschließlich Zeilenumbrüchen). Zum Beispiel findet /.n/ "an" und "an" in "nein, ein Apfel ist am Baum", aber nicht "nein".
( x ) Findet x und erinnert sich. Dies wird "Speicherklammern" genannt. Beispiel: / (foo) / findet und merkt sich "foo" in "foo bar". Der gefundene Teilstring wird im Suchergebnis-Array oder in den vordefinierten Eigenschaften des RegExp-Objekts gespeichert: $ 1, ..., $ 9. Zusätzlich kombinieren die Klammern, was in ihnen ist, in ein einzelnes Element des Musters. Zum Beispiel ist (abc) * eine Wiederholung abc 0 oder mehrmals.
(?: x ) Findet x , kann sich aber nicht erinnern, was es gefunden hat. Dies wird als "nicht speicherbare Klammern" bezeichnet. Der gefundene Teilstring wird nicht im Ergebnisarray und den RegExp-Eigenschaften gespeichert, sondern kombiniert wie alle Klammern den darin gefundenen Teilstring zu einem einzigen Teilmuster.
x (? = y ) Finde x nur, wenn x von y gefolgt wird. Zum Beispiel, / Jack (? = Sprat) / findet 'Jack' nur, wenn darauf 'Sprat' folgt. / Jack (? = Sprat | Frost) / findet "Jack" nur, wenn "Sprat" oder "Frost" folgt. Es wird jedoch weder 'Sprat' noch 'Frost' in das Suchergebnis aufgenommen.
x (?! y ) Finde x nur, wenn x nicht y folgt. Zum Beispiel wird /\d+(?!\.)/ nur dann eine Zahl finden, wenn kein Dezimalpunkt dahinter steht. /\d+(?!\.)/.exec("3.141 ") findet 141, aber nicht 3.141.
x | y Findet x oder y . Zum Beispiel findet / grün | rot / im grünen Apfel "grün" und im "roten Apfel" "rot".
{ n } Wobei n eine positive ganze Zahl ist. Finde genau n Wiederholungen des vorhergehenden Elements. Zum Beispiel findet / a {2} / "a" nicht in "candy", aber findet sowohl a in "caandy" als auch die ersten beiden a in "caaandy".
{ n ,} Wobei n eine positive ganze Zahl ist. Findet n oder mehrere Wiederholungen des Elements. Zum Beispiel findet / a {2,} kein "a" in "candy", findet aber alles "a" in "caandy" und in "caaaaaaandy".
{ n , m } Wobei n und m positive ganze Zahlen sind. Finde von n bis m Elementwiederholungen.
[ xyz ] Zeichensatz. Sucht nach den aufgelisteten Zeichen. Sie können eine Lücke mit einem Bindestrich angeben. Zum Beispiel ist [abcd] dasselbe wie [ad] . Finde 'b' in der 'brisket', sowie 'a' und 'c' in der "schmerze".
[^ xyz ] Jedes Zeichen, das nicht in der Gruppe angegeben ist. Sie können auch eine Lücke angeben. Zum Beispiel ist [^ abc] dasselbe wie [^ ac] . Finde 'r' in 'brisket' und 'h' in 'chop'.
[\ b] Findet das Backspace-Zeichen. (Nicht zu verwechseln mit \ b .)
\ b Findet die Grenze von Wörtern (Latein), zum Beispiel ein Leerzeichen. (Nicht zu verwechseln mit [\ b] ). Zum Beispiel wird / \ bn \ w / in "noonday" "no" finden; / \ wy \ b / wird "ly" in "möglicherweise gestern" finden.
\ B Zeigt nicht die Grenze von Wörtern an. Zum Beispiel: / \ w \ Bn / findet "on" in "noonday" und / y \ B \ w / findet "ye" in "möglicherweise gestern".
\ c X Wobei X der Buchstabe von A bis Z ist. Gibt das Steuerzeichen in der Zeile an. Zum Beispiel bezeichnet / \ cM / das Zeichen Strg-M.
\ d findet eine Nummer aus jedem Alphabet (wir haben den gleichen Unicode). Verwenden Sie [0-9], um nur normale Ziffern zu finden. Zum Beispiel wird / \ d / oder / [0-9] / "2" in "B2 ist die Suite-Nummer" finden.
\ D Suchen Sie ein nicht numerisches Zeichen (alle Alphabete). [^ 0-9] ist das Äquivalent für normale Ziffern. Zum Beispiel wird / \ D / oder / [^ 0-9] / "B" in "B2 ist die Suite-Nummer" finden.
\ f, \ r, \ n Die entsprechenden Sonderzeichen form-feed, line-feed, line feed.
\ s Sucht nach Leerzeichen, Leerzeichen, Tabulatoren, Zeilenumbrüchen und anderen Unicode-Leerzeichen. Zum Beispiel wird / \ s \ w * / in der "foo bar" "bar" finden.
\ S Findet jedes Zeichen außer dem Leerzeichen. Zum Beispiel wird / \ S \ w * / "foo" in "foo bar" finden.
\ t Das Tab-Zeichen.
\ v Das Symbol der vertikalen Tabellierung.
\ w Suchen Sie nach einem verbalen Zeichen (lateinisches Alphabet), einschließlich Buchstaben, Zahlen und einem Unterstrich. Entspricht [A-Za-z0-9_] . Zum Beispiel, / \ w / findet "a" in "apple", "5" in "$ 5,28" und "3" in "3D".
\ W Finde irgendein nicht-lateinisches verbales Symbol. Entspricht [^ A-Za-z0-9_] . Zum Beispiel wird / \ W / und / [^ $ A-Za-z0-9 _] / ebenfalls "%" in "50%" finden.
\ n wobei n eine ganze Zahl ist. Eine Rückwärtsreferenz auf die n-te gespeicherte Teilzeichenfolge. Zum Beispiel wird / apple (,) \ sorange \ 1 / "Apfel, Orange" in "Apfel, Orange, Kirsche, Pfirsich" finden. Es gibt ein vollständigeres Beispiel hinter der Tabelle.
\ 0 Finde den NUL Charakter. Fügen Sie keine anderen Zahlen am Ende hinzu.
\ x hh Finde das Zeichen mit dem Code hh (2 hexadezimale Ziffern)
\ hhhhh Finde das Zeichen mit dem Code hhhh (4 hexadezimale Ziffern).

Um nur zu testen, ob eine Zeichenfolge mit einem regulären Ausdruck übereinstimmt, verwenden Sie die Testmethode :

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

Die Methode exec 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 gefundenes b und das nächste d
// Registerunabhängige Suche
var myRe = / d (b +) (d) / ig;
var myArray = myRe.exec ("cdbBdbsbz");

Als Ergebnis der Skriptausführung werden folgende Ergebnisse angezeigt:

Objekt Eigenschaft / Index Beschreibungen Beispiel:
meinArray Inhalt von myArray . ["dbBd", "bB", "d"]
Index Übereinstimmungsindex (von 0) 1
Eingabe Die Quellenzeichenfolge cdbBdbsbz
[0] Zuletzt übereinstimmende Zeichen dbBd
[1], ... [ n ] Entspricht ggf. verschachtelten Klammern. Die Anzahl der verschachtelten Klammern ist nicht begrenzt. [1] = bB
[2] = d
meinRe letzterIndex Der Index, von dem aus die nächste Suche gestartet werden soll. 5
ignoreCase Zeigt an, dass die Suche nach Groß- und Kleinschreibung aktiviert wurde, das Flag " i ". wahr
global Zeigt an, dass das " g " -Flag aller Übereinstimmungen aktiviert wurde. wahr
mehrzeilig Gibt an, ob das mehrzeilige Suchkennzeichen " m " aktiviert wurde. falsch
Quelle Mustertext. d (b +) (d)

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

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

Dieses Skript zeigt den folgenden Text an:

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

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

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

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 + / ifxec (Eingabe);
wenn (! Vorname)
{
drucken (Eingabe + "ist kein Name!");
Rückkehr;
}

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

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

Alle Methoden außer replace können sowohl mit Objekten vom Typ regexp in Argumenten als auch mit Strings aufgerufen werden, die automatisch in RegExp-Objekte konvertiert werden.

Also sind die Anrufe gleichwertig:

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

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

var i = str.search (neue 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 mit einem regulären Ausdruck übereinstimmt, verwenden Sie die Suchmethode (ähnlich den Testmethoden von RegExp). Um weitere Informationen zu erhalten, verwenden Sie die langsamere Match- Methode (ähnlich der Exe- Methode RegExp ).

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

Funktion Testinput (re, str) {
if (str.suche (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 , wird dasselbe Ergebnis wie regexp.exec (string) zurückgegeben .

Wenn in regexp ein Flag g vorhanden ist , wird ein Array mit allen Übereinstimmungen zurückgegeben.

Um einfach herauszufinden, ob eine Zeichenkette mit dem regulären regulären Ausdruck übereinstimmt , verwenden Sie regexp.test (string) .

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

Im folgenden Beispiel wird die Übereinstimmung verwendet, um nach "Kapitel" zu suchen, gefolgt von einer oder mehreren Ziffern gefolgt von Ziffern, die durch einen Punkt getrennt sind. Im regulären Ausdruck gibt es ein Flag i , so dass das Register 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 wird ein Array von Übereinstimmungen zurückgeben:

  • Kapitel 3.4.5.1 - vollständig übereinstimmende Zeichenfolge
  • 3.4.5.1. Erste Klammer
  • .1 - innere Klammer

Das folgende Beispiel zeigt die Verwendung von globalen und case-insensitiven Suchflags mit Übereinstimmung . Es werden alle Buchstaben von A bis E und von a bis e jeweils in einem separaten Element des Arrays gefunden.

var str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
var regexp = / [AE] / gi;
var stimmt überein = str.match (regexp);
document.write (Übereinstimmungen);
// Übereinstimmungen = [A, B, C, D, E, A, B, C, D, e)

Die Methode replace kann Vorkommen eines regulären Ausdrucks nicht nur durch eine Zeichenfolge, sondern auch durch das Ergebnis einer Funktion ersetzen. Seine vollständige Syntax lautet wie folgt:

var newString = str.replace (regexp / substr, newSubStr / funktion)
regexp
Das RegExp-Objekt. Seine Vorkommen werden durch einen Wert ersetzt, der den Parameter Nummer 2 zurückgibt
Teilstr
Eine Zeichenfolge, die durch newSubStr ersetzt wird.
neuSubStr
Eine Zeichenfolge, die eine Teilzeichenfolge von Argument Nummer 1 ersetzt.
Funktion
Eine Funktion, die aufgerufen werden kann, um eine neue Teilzeichenfolge zu erzeugen (um sie für die Teilzeichenfolge aus Argument 1 zu ersetzen).

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

Um eine globale Ersetzung zu implementieren, 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 zu ersetzende Aufruf hat die Zeichenfolge unverändert gelassen, weil ich nicht nach dem regulären Ausdruck \ s , sondern nach der Zeichenfolge "\ s" gesucht habe.

In der Ersatzzeile kann solche speziellen Zeichen sein:

Muster Einsätze
$$ Fügt "$" ein.
$ & Fügt den gefundenen Teilstring ein.
$ ` Fügt einen Teil der Zeichenfolge ein, die dem Auftreten des Vorkommens vorausgeht.
$ ' Fügt einen Teil der Zeichenfolge ein, die auf das Auftreten des Vorkommens folgt.
$ n oder $ nn Wenn n oder nn Dezimalstellen sind, wird eine mit der n-ten verschachtelten Klammer gespeicherte Vorkommnis-Teilzeichenfolge eingefügt, 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 eine Substitutionszeichenfolge dynamisch 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, in der die Übereinstimmung aufgetreten ist, und die Zeichenfolge selbst.

Zum Beispiel gibt die folgende Rufumsetzung XXzzzz - XX, zzzz zurück.

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

Wie Sie sehen können, gibt es zwei Klammern im regulären Ausdruck, und daher gibt es zwei Parameter p1 , p2 in der Funktion.
Wenn es drei Klammern gäbe, müsste die Funktion den Parameter p3 hinzufügen.

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

Funktion styleHyphenFormat (propertyName)
{
Funktion UpperToHyphenLower (Match)
{
Rückgabe '-' + match.toLowerCase ();
}
return propertyName.replace (/ [AZ] /, obererHyphenLower);
}

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

Sie werden ausführlicher im Buch Reguläre Ausdrücke beginnen beschrieben .