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 .

Darüber hinaus haben die Strings ihre eigenen Methoden Suchen , Abgleichen , Ersetzen , aber um diese zu verstehen, werden wir zuerst RegExp analysieren.

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

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

Das Muster ist ein regulärer Ausdruck für die Suche (später ersetzen), und Flags sind Zeichenfolgen aus einer beliebigen Kombination von Zeichen g (globale Suche), i (bedeutungslos) und m (mehrzeilige Suche).

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

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

Beim zweiten Aufruf - weil der reguläre Ausdruck in Anführungszeichen ist, müssen Sie \

// sind gleichwertig
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 normale Zeichen - macht sie besonders. Zum Beispiel sucht der Ausdruck / s / nur nach dem Zeichen 's'. Wenn Sie \ vor s setzen, bedeutet \ \ / / bereits ein Whitespace-Zeichen. Umgekehrt, wenn das Zeichen ein spezielles ist, zum Beispiel *, wird \ nur das gewöhnliche "Sternchen" Beispielsweise sucht / a * / nach 0 oder mehreren aufeinanderfolgenden Zeichen 'a'. Um ein mit dem Sternchen 'a *' zu finden - legen Sie \ vor Spets. durch das Symbol: / a \ * / .
^ Zeigt den Anfang der Eingabedaten an. Wenn das mehrzeilige Suchflag ("m") gesetzt ist , wird es auch funktionieren, wenn eine neue Zeile beginnt. Beispielsweise findet / ^ A / kein "A" in "A", findet aber das erste "A" in "An A"
$ Zeigt das Ende der Eingabedaten an. Wenn das mehrzeilige Such-Flag gesetzt ist, wird es auch am Ende der Zeile funktionieren. Beispielsweise wird / t $ / im "eater" kein 't' finden, aber es wird in "eat" gefunden.
* Zeigt eine Wiederholung von 0 oder mehr an. Zum Beispiel / bo * / findet "boooo" in "Ein Geist booooed" und "b" in "Ein Vogel geflucht", findet aber nichts in "Eine Ziege grunzten".
+ Zeigt eine Wiederholung von 1 oder mehrmals an. Es entspricht {1,} . Zum Beispiel / a + / findet 'a' in 'Süßigkeiten' und alle 'a' in 'caaaaaaaandy'.
? Zeigt an, dass der Artikel möglicherweise vorhanden ist oder nicht. Zum Beispiel / e? Le? / Findet 'el' in 'angel' und 'le' in "angle." Wenn Sie unmittelbar nach einem der Quantoren * , + ,? , oder {} , spezifiziert es die "nicht gierige" Suche (die Wiederholung ist die minimal mögliche Anzahl von Malen bis zum nächsten nächsten Musterelement), im Gegensatz zum "gierigen" Standardmodus, bei dem die Anzahl der Wiederholungen maximal ist, auch wenn das nächste Musterelement ebenfalls 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 [\ s \ S] verwenden, um nach einem beliebigen Zeichen zu suchen, einschließlich Zeilenumbrüchen). Zum Beispiel findet /.n/ in "nein, ein Apfel ist auf dem Baum", aber nicht 'nein'.
( x ) Findet x und merkt sich. Dies wird "Speicherklammern" genannt. Beispiel: / (foo) / findet und merkt sich "foo" in "foo bar". Der gefundene Teilstring wird im Suchergebnisarray oder in den vordefinierten Eigenschaften des RegExp-Objekts gespeichert: $ 1, ..., $ 9. Darüber hinaus kombinieren die Klammern die darin enthaltenen Elemente zu einem einzelnen Element des Musters. Zum Beispiel ist (abc) * eine Wiederholung abc 0 oder mehr.
(?: x ) Findet x , merkt sich aber nicht, was es gefunden hat. Dies wird als "nicht memorierende Klammern" bezeichnet. Der gefundene Teilstring wird nicht im Ergebnisarray und den RegExp-Eigenschaften gespeichert. Wie alle Klammern kombinieren sie den in ihnen gefundenen Teil in einem einzigen Teilmuster.
x (? = y ) Finde nur x , wenn x von y gefolgt wird. Zum Beispiel / Jack (? = Sprat) / findet 'Jack' nur, wenn es von 'Sprat' gefolgt wird. / Jack (? = Sprat | Frost) / findet nur dann "Jack", wenn "Sprat" oder "Frost" gefolgt wird. Weder "Sprotte" noch "Frost" werden jedoch in das Suchergebnis aufgenommen.
x (?! y ) Finde nur x , wenn x nicht y folgt. Zum Beispiel wird /\d+(?!\.)/ nur dann eine Nummer finden, wenn kein Dezimaltrennzeichen folgt. /\d+(?!\.)/.exec("3.141 ") finden 141, aber nicht 3.141.
x | y Findet x oder y . Zum Beispiel wird / green | red / im grünen Apfel und grün im roten Apfel "grün" finden.
{ n } Wo n eine positive ganze Zahl ist. Finde genau n Wiederholungen des vorhergehenden Elements. Beispiel: / a {2} / findet in "candy" kein "a", findet aber sowohl in "caandy" als auch in den beiden ersten in "caaandy".
{ n ,} Wo n eine positive ganze Zahl ist. Findet n oder mehr Wiederholungen des Elements. Beispielsweise findet / a {2,} kein "a" in "candy", sondern findet alles "a" in "caandy" und in "caaaaaaandy".
{ n , m } Wo n und m positive ganze Zahlen sind. Finde von n bis m Elementwiederholungen.
[ xyz ] Zeichensatz. Sucht nach einem der aufgelisteten Zeichen. Sie können eine Lücke mit einem Bindestrich angeben. Beispielsweise ist [abcd] dasselbe wie [ad] . Finde "b" im "Bruststück", sowie "a" und "c" im "Schmerz".
[^ xyz ] Alle anderen Zeichen als die im Satz angegebenen. Sie können auch eine Lücke angeben. Zum Beispiel ist [^ abc] dasselbe wie [^ ac] . Finde "r" in "brisket" und "h" in "chop".
[\ b] Sucht das Backspace-Zeichen. (Nicht zu verwechseln mit \ b .)
\ b Findet die Wortgrenze (lateinisch), z. B. ein Leerzeichen. (Nicht zu verwechseln mit [\ b] ). Beispielsweise wird / \ bn \ w / in "noonday" 'no' finden; / \ wy \ b / wird in "möglicherweise gestern" "ly" finden.
\ B Zeigt nicht die Grenze von Wörtern an. Zum Beispiel / \ w \ Bn / findet "on" in "mittags" und / y \ B \ w / findet 'ye' in "möglicherweise gestern".
\ c X Wo X der Buchstabe von A bis Z ist. Zeigt das Steuerzeichen in der Zeile an. Zum Beispiel bezeichnet / \ cM / das Zeichen Ctrl-M.
\ d findet eine Zahl aus einem beliebigen Alphabet (wir haben den gleichen Unicode). Verwenden Sie [0-9], um nur normale Ziffern zu finden. Beispiel: / \ d / oder / [0-9] / findet in "B2 die Nummer der Suite" '2'.
\ D Suchen Sie nach einem nicht-numerischen Zeichen (alle Alphabete). [^ 0-9] ist das Äquivalent für gewöhnliche Ziffern. Zum Beispiel wird / \ D / oder / [^ 0-9] / in B "B2 die Nummer der Suite" finden.
\ f, \ r, \ n Die entsprechenden Sonderzeichen Form-Feed, Zeilenvorschub, Zeilenvorschub.
\ s Sucht nach einem Leerzeichen, einschließlich Leerzeichen, Tabulatoren, Zeilenumbrüchen und anderen Unicode-Leerzeichen. Zum Beispiel / \ s \ w * / findet 'bar' in der "foo bar".
\ S Findet alle Zeichen außer dem Leerzeichen. Beispiel: / \ S \ w * / findet "foo" in "foo bar".
\ t Das Tabulatorzeichen.
\ v Das Symbol der vertikalen Tabellen.
\ w Finden Sie ein verbales (lateinisches Alphabet) Zeichen, einschließlich Buchstaben, Zahlen und einem Unterstrich. Entspricht [A-Za-z0-9_] . Beispiel: / \ w / findet in "apple", "5" in "$ 5.28" und "3" in "3D" ein "a".
\ W Finden Sie ein nicht lateinisches verbales Symbol. Entspricht [^ A-Za-z0-9_] . Zum Beispiel wird / \ W / und / [^ $ A-Za-z0-9 _] / gleich "%" in "50%" finden.
\ n wo n eine ganze Zahl ist. Eine rückwärtige Referenz auf die n-te gespeicherte Teilkette. Zum Beispiel / apple (,) \ sorange \ 1 / findet 'Apfel, Orange' in 'Apfel, Orange, Kirsche, Pfirsich.' Es gibt ein vollständigeres Beispiel hinter dem Tisch.
\ 0 Finde den NUL-Charakter. Fügen Sie keine weiteren Zahlen zum Ende hinzu.
\ x hh Finde das Zeichen mit dem Code hh (2 hexadezimale Ziffern)
\ u hhhh Suchen Sie das Zeichen mit dem Code hhhh (4 hexadezimale Ziffern).

Um nur zu testen, ob ein String einem regulären Ausdruck entspricht, verwenden Sie die Testmethode :

if (/\s/.test ("line")) {
... Es gibt Plätze in der Linie! ...
}

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

Infolge der Skriptausführung werden sich solche Ergebnisse ergeben:

Objekt Eigenschaft / Index Beschreibungen Beispiel:
myArray Inhalt von myArray . ["dbBd", "bB", "d"]
Index Übereinstimmungsindex (von 0) 1
Eingabe Die Quellzeichenfolge. cdbBdbsbz
[0] Kürzlich übereinstimmende Charaktere dbBd
[1], ... [ n ] Übereinstimmungen in verschachtelten Klammern, falls vorhanden. Die Anzahl der verschachtelten Klammern ist unbegrenzt. [1] = bB
[2] = d
myRe lastIndex Der Index, von dem aus die nächste Suche gestartet werden soll. 5
ignoreCase Gibt an, dass eine Suche ohne Groß- / Kleinschreibung aktiviert wurde, das Flag " i ". true
globalen Zeigt an, dass die " g " -Flag aller Treffer aktiviert war. true
mehrzeilig Gibt an, ob das mehrzeilige Suchflag " m " aktiviert wurde. false
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 dem Teilstring str mit dem Index lastIndex . Zum Beispiel, hier ist ein Skript:

var myRe = / ab * / g;
var str = "abbcdefabh";
while ((myArray = myRe.exec (str))! = null) {
var msg = "Gefunden" + myArray [0] + ".";
msg + = "Die nächste Übereinstimmung beginnt bei" + myRe.lastIndex;
print (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

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

Es wird angenommen, dass sich alle registrierten Namen im 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 (input + "ist kein Name!");
Rückkehr;
}

var count = 0;
für (var i = 0; i <A.length; i ++)
{
if (firstName [0] .toLowerCase () == Ein [i] .toLowerCase ())
count ++;
}
var midstring = (count == 1)? "andere hat": "andere haben";
print ("Danke", + count + midstring + "denselben Namen!")
}

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

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.

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 geeignet

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 ein String einem regulären Ausdruck entspricht, verwenden Sie die Suchmethode (ähnlich wie bei den RegExp- Testmethoden ). Um weitere Informationen zu erhalten, verwenden Sie die Methode mit langsamer Übereinstimmung (ähnlich der Exec- Methode von RegExp ).

In diesem Beispiel wird eine Nachricht angezeigt, je nachdem, ob der String dem regulären Ausdruck entspricht.

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

Wenn Regexp nicht das Flag g hat , wird das gleiche Ergebnis wie Regexp.exec (String) zurückgegeben .

Wenn in regexp ein Flag g steht , dann gibt es ein Array mit allen Übereinstimmungen zurück.

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

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

Im folgenden Beispiel wird Übereinstimmung verwendet, um "Kapitel" zu finden, gefolgt von einer oder mehreren Ziffern, gefolgt von Ziffern, die durch eine Periode 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;
found = str.match (re);
Warnung (gefunden);

Das Skript gibt ein Array von Übereinstimmungen zurück:

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

Das folgende Beispiel veranschaulicht die Verwendung globaler und case-insensitive Suchflags mit Übereinstimmung . Es werden alle Buchstaben von A nach E und von a nach e gefunden - in einem separaten Element des Arrays.

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

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

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

Die replace- Methode ändert nicht die Zeile, auf der sie aufgerufen wird, sondern gibt einfach eine neue, modifizierte Zeichenfolge zurück.

Um einen globalen Ersatz zu implementieren, fügen Sie das Flag "g" im regulären Ausdruck ein.

Wenn das erste Argument eine Zeichenfolge ist, wird es nicht in einen regulären Ausdruck konvertiert, so zum Beispiel,

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

Der zu ersetzende Aufruf hat die Zeichenfolge unverändert gelassen, weil ich nicht nach dem regulären Ausdruck gesucht habe , sondern nach der Zeichenfolge "\ s".

In der Ersatzzeile können solche Sonderzeichen stehen:

Muster Einsätze
$$ Fügt "$" ein.
$ & Fügt den gefundenen Teilstring ein.
$ ` Fügt einen Teil der Zeichenfolge ein, die dem Vorkommen des Vorkommens vorausgeht.
$ ' Fügt einen Teil der Zeichenfolge ein, der auf das Auftreten des Ereignisses folgt.
$ n oder $ nn Wenn n oder nn Dezimalziffern sind, fügt ein Auftretensubstring ein, das mit der n-ten verschachtelten Klammer gespeichert ist, 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 Ersetzungszeichenfolge 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 stattgefunden hat, und die Zeichenfolge selbst.

Der folgende Aufruf ersetzt beispielsweise XXzzzz - XX, zzzz.

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

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

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

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

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

Sie werden ausführlicher in dem Buch Beginning Reguläre Ausdrücke beschrieben .