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 durch ein spezielles RegExp- Objekt.

Darüber hinaus haben die Zeilen ihre eigenen Methoden search , match , replace . Um sie jedoch zu verstehen, analysieren wir zunächst RegExp .

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

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

Muster ist ein regulärer Ausdruck, nach dem gesucht werden soll (Ersetzung erfolgt später), und Flags sind eine Zeichenfolge aus einer beliebigen Kombination der Zeichen g (globale Suche), i (ohne Berücksichtigung von Groß- und Kleinschreibung) und m (mehrzeilige Suche).

Die erste Methode wird häufig verwendet, die zweite manchmal. Zum Beispiel sind zwei solcher Aufrufe 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 \

// 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 gewöhnliche Charaktere - macht sie besonders. Zum Beispiel sucht der Ausdruck / s / nur nach dem Zeichen 's'. Wenn Sie \ vor s setzen, bezeichnet \ \ s / bereits einen Whitespace-Zeichensatz, und umgekehrt, wenn ein Zeichen speziell ist, z. B. *, wird \ aus einem gewöhnlichen Sternchen bestehen. Beispielsweise sucht / a * / nach 0 oder mehr aufeinanderfolgenden 'a'-Zeichen. Um ein mit einem Sternchen 'a *' zu finden, setzen Sie \ vor die Angabe. Symbol: / a \ * / .
^ Gibt den Beginn der Eingabedaten an. Wenn das mehrzeilige Suchflag gesetzt ist ("m") , funktioniert es auch, wenn eine neue Zeile gestartet wird. Beispielsweise findet / ^ A / kein "A" in "ein A", sondern das erste "A" in "ein A".
$ Zeigt das Ende der Eingabedaten an. Wenn das mehrzeilige Suchflag gesetzt ist, funktioniert es auch am Ende der Zeile. Beispielsweise findet / t $ / das 't' nicht im "Esser", sondern im "eat".
* Zeigt eine Wiederholung von 0 oder mehr Male an. Zum Beispiel wird / bo * / "boooo" in "A ghost booooed" und "b" in "A bird aufgewirrt" finden, aber in "A gount grunted" nichts finden.
+ Zeigt Wiederholung 1-mal oder mehrmals an. Entspricht {1,} . Zum Beispiel: / a + / findet "a" in "candy" und alle "a" in "caaaaaaandy".
? Gibt an, dass das Element vorhanden sein kann oder nicht. Zum Beispiel: / e? Le? / Findet 'el' in 'angel' und 'le' in 'angle'. Wird unmittelbar nach einem der Quantifizierer * verwendet , + ,? , oder {} , setzt eine nicht gierige Suche (Wiederholung der minimal möglichen Anzahl bis zum nächsten Element des Musters) im Gegensatz zum Standard-Giermodus, in dem die Anzahl der Wiederholungen maximal ist, selbst wenn das nächste Element des Musters ebenfalls geeignet ist. ,? verwendet in der Vorschau, die in der Tabelle unter (? =) , (?!) und (? :) beschrieben wird .
. (Dezimalpunkt) bezeichnet ein beliebiges Zeichen außer der Newline: \ n \ r \ u2028 oder \ u2029. ( Sie können mit [\ s \ S] nach beliebigen Zeichen, einschließlich Zeilenumbrüchen, suchen). Zum Beispiel findet /.n/ "an" und "an" in "Nein, ein Apfel ist auf dem Baum", aber nicht "Nein".
( x ) Findet x und erinnert sich. Dies wird als "Memory Brackets" bezeichnet. Zum Beispiel wird / (foo) / 'foo' in der 'foo bar' finden und merken. Die gefundene Teilzeichenfolge wird im Suchergebnisfeld oder in den vordefinierten Eigenschaften des RegExp-Objekts gespeichert: $ 1, ..., $ 9. Zusätzlich kombinieren die Klammern, was in ihnen ist, zu einem einzigen Element des Musters. Zum Beispiel (abc) * - abc 0 mal oder öfter wiederholen.
(?: x ) Findet x , kann sich aber nicht erinnern, was gefunden wurde. Dies wird als "nicht speicherende Klammern" bezeichnet. Die gefundene Teilzeichenfolge wird nicht im Ergebnis-Array und in den Eigenschaften von RegExp gespeichert. Kombinieren Sie die Klammern in allen Klammern in einem einzigen Teilmuster.
x (? = y ) Findet x nur, wenn x auf x folgt. Zum Beispiel: / Jack (? = Sprat) / findet 'Jack' nur, wenn es von 'Sprat' gefolgt wird. / Jack (? = Sprat | Frost) / findet 'Jack' nur, wenn 'Sprat' oder 'Frost' folgt. Weder "Sprotte" noch "Frost" geben das Suchergebnis ein.
x (?! y ) Findet x nur, wenn x nicht von y gefolgt wird. Beispielsweise findet /\d+(?!\.)/ die Zahl nur, wenn kein Dezimalzeichen folgt. /\d+(?!\.)/.exec ("3.141") findet 141, aber nicht 3.141.
x | y Finde x oder y . Zum Beispiel: / green | red / findet "grün" in "grüner Apfel" und "rot" in "roter Apfel".
{ n } Dabei ist n eine positive ganze Zahl. Findet genau n Wiederholungen des vorherigen Elements. Zum Beispiel: / a {2} / findet in "Candy" kein "a", sondern sowohl in "caandy" als auch die ersten beiden in "caaandy".
{ n ,} Dabei ist n eine positive ganze Zahl. Findet n oder mehr Wiederholungen des Elements. Zum Beispiel wird / a {2,} in "Candy" kein "a" finden, sondern in "caandy" und in "caaaaaaandy".
{ n , m } Wobei n und m positive ganze Zahlen sind. Wiederholungen des Elements von n bis m finden.
[ xyz ] Zeichensatz Findet alle aufgelisteten Zeichen. Sie können eine Lücke mit einem Bindestrich angeben. Zum Beispiel ist [abcd] dasselbe wie [ad] . Findet 'b' im Bruststück sowie 'a' und 'c' im Schmerz.
[^ xyz ] Jedes Zeichen außer den im Set angegebenen. Sie können auch eine Lücke angeben. Zum Beispiel ist [^ abc] dasselbe wie [^ ac] . Findet "r" in "Brust" und "h" in "hacken".
[\ b] Findet das Backspace-Zeichen. (Nicht zu verwechseln mit \ b .)
\ b Sucht die Grenze von Wörtern (lateinisch), zum Beispiel ein Leerzeichen. (Nicht zu verwechseln mit [\ b] ). Zum Beispiel findet / \ bn \ w / 'noonday'; / \ wy \ b / findet das "ly" in "möglicherweise gestern".
\ B Zeigt keine Wortgrenze an. Zum Beispiel wird / \ w \ Bn / in 'noonday' 'ein' finden und / y \ B \ w / 'ye' in 'möglicherweise gestern'.
\ c X Dabei steht X für den Buchstaben von A bis Z. 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. Zum Beispiel findet / \ d / oder / [0-9] / "2" in "B2 ist die Suite-Nummer".
\ D Sucht 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 Formular-Feed, Zeilenvorschub, Zeilenvorschub.
\ s Es werden alle Leerzeichen, einschließlich Leerzeichen, Tabulatoren, Zeilenumbrüche und andere Unicode-Leerzeichen, gefunden. Zum Beispiel wird / \ s \ w * / 'bar' in 'foo bar' finden.
\ S Finde jedes Zeichen außer dem Leerzeichen. Zum Beispiel findet / \ S \ w * / 'foo' in der 'foo bar'.
\ t Tabulatorzeichen
\ v Vertikaler Tabulator
\ w Findet alle verbalen Zeichen (lateinisches Alphabet), einschließlich Buchstaben, Zahlen und Unterstrich. Äquivalent zu [A-Za-z0-9_] . Zum Beispiel findet / \ w / 'a' in 'apple', '5' in '5,28 $' und '3' in '3D'.
\ W Finden Sie ein beliebiges Symbol (nicht (lat.)). Äquivalent zu [^ A-Za-z0-9_] . Beispielsweise finden / \ W / und / [^ $ A-Za-z0-9 _] / das '%' gleichermaßen in "50%".
\ n wobei n eine ganze Zahl ist. Rückwärtsreferenz auf die n-te in Klammern gespeicherte Teilzeichenfolge. Zum Beispiel wird / apple (,) \ sorange \ 1 / 'Apfel, Orange' in 'Apfel, Orange, Kirsche, Pfirsich finden. " Hinter dem Tisch befindet sich ein vollständigeres Beispiel.
\ 0 Finde den Charakter NUL. Fügen Sie keine anderen Zahlen am Ende hinzu.
\ x hh Suchen Sie ein Zeichen mit dem hh- Code (2 Hexadezimalstellen).
hhhh Findet das Zeichen mit dem hhhh- Code (4 Hexadezimalstellen).

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

if (/\s/.test ("string")) {
... Es gibt 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
// Erinnere dich an gefundenes b und nächstes
// Suche nach Groß- und Kleinschreibung
var myRe = / d (b +) (d) / ig;
var myArray = myRe.exec ("cdbBdbsbz");

Als Ergebnis des Skripts ergeben sich folgende Ergebnisse:

Das Objekt Eigenschaft / Index Beschreibungen Beispiel
myArray Der Inhalt von myArray . ["dbBd", "bB", "d"]
Index Übereinstimmungsindex (von 0) 1
Eingabe Quellstring cdbBdbsbz
[0] Letzte übereinstimmende Zeichen dbBd
[1], ... [ n ] Übereinstimmungen in geschachtelten Klammern, falls vorhanden. Die Anzahl der geschachtelten 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 Berücksichtigung der Groß- und Kleinschreibung aktiviert wurde, das Flag " i ". wahr
global Zeigt an, dass das Übereinstimmungssuchflag " g " aktiviert wurde. wahr
mehrzeilig Zeigt an, ob das Mehrzeilen-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 viele Male aufrufen, um nach aufeinanderfolgenden Übereinstimmungen in derselben Zeichenfolge zu suchen. Wenn Sie dies tun, beginnt die Suche mit der Teilzeichenfolge str und dem Index lastIndex . Zum Beispiel ist hier das Skript:

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

Dieses Skript zeigt den folgenden Text an:

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

Im folgenden Beispiel sucht die Funktion nach Eingaben. Es durchläuft dann das Array, um zu sehen, ob andere Namen vorhanden sind.

Es wird angenommen, dass sich alle registrierten Namen in Feld 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 hat": "andere haben";
print ("Danke", + Count + Midstring + "gleicher Name!")
}

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

Mit Ausnahme von replace können alle Methoden sowohl mit Objekten vom Typ regexp in Argumenten als auch mit Strings aufgerufen werden, die automatisch in RegExp-Objekte konvertiert werden.

Die Aufrufe sind also gleichwertig:

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

Bei der Verwendung von Anführungszeichen müssen Sie \ duplizieren, und es gibt keine Möglichkeit, Flags anzugeben. Daher ist es 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 Testmethoden von RegExp). Für weitere Informationen verwenden Sie die langsamere Übereinstimmungsmethode (ähnlich der RegExp- Exec- Methode).

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.search (re)! = -1)
midstring = "enthält";
sonst
midstring = "enthält nicht";
document.write (str + midstring + re.source);
}

Wenn der reguläre Ausdruck nicht das Flag g hat , gibt er dasselbe Ergebnis wie regexp.exec (Zeichenfolge) zurück .

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

Verwenden Sie regexp.test (string) , um einfach herauszufinden, ob die Zeichenfolge dem regulären Ausdruck für den regulären Ausdruck entspricht .

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

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

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

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

  • Kapitel 3.4.5.1 - vollständig übereinstimmende Zeile
  • 3.4.5.1 - die erste Klammer
  • .1 - interne Halterung

Das folgende Beispiel veranschaulicht die Verwendung globaler Suchzeichen und von Groß- und Kleinschreibung ohne Übereinstimmung mit Übereinstimmung . Alle Buchstaben von A bis E und von A bis E werden in einem separaten Element des Arrays gefunden.

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

Die replace-Methode kann Vorkommen 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 / -Funktion)
Regex
RegExp-Objekt Ihre Einträge werden durch den von Parameternummer 2 zurückgegebenen Wert ersetzt
substr
Die Zeichenfolge, die durch newSubStr ersetzt werden soll .
newSubStr
Die Zeichenfolge, die die Teilzeichenfolge in Argument Nummer 1 ersetzt.
Funktion
Die Funktion, die zum Generieren eines neuen Teilstrings aufgerufen werden kann (um ihn anstelle des aus Argument 1 erhaltenen Teilstrings zu ersetzen).

Die replace- Methode ändert nicht die Zeile, in der sie aufgerufen wurde, sondern gibt einfach eine neue, modifizierte 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, z. B.

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

Der zu ersetzende Aufruf hat die Zeichenfolge unverändert gelassen, da nicht nach regulären Ausdrücken gesucht wurde, sondern nach der Zeichenfolge "\ s".

Die Ersatzzeichenfolge kann solche Sonderzeichen enthalten:

Muster Einsätze
$$ Fügt "$" ein.
$ & Fügt den gefundenen Teilstring ein.
$ ` Fügt den Teil der Zeile ein, der dem gefundenen Eintrag vorangeht.
$ ' Fügt den Teil der Zeile ein, der nach dem gefundenen Vorkommen erscheint.
$ n oder $ nn Wenn n oder nn Dezimalstellen sind, wird der Teilstring des von 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 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 folgenden n Parameter Übereinstimmungen aus den geschachtelten Klammern. Die letzten beiden Parameter sind die Position in der Zeile, an der der Koinzidenz aufgetreten ist, 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 *) /, Ersetzer)

Wie Sie sehen, gibt es im regulären Ausdruck zwei Klammern, und daher gibt es in der Funktion zwei Parameter p1 , p2 .
Bei drei Klammern müsste der Parameter der Parameter p3 hinzugefügt werden.

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

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

Für ein allgemeines Verständnis regulärer Ausdrücke lesen Sie den Artikel in Wikipedia .

Sie werden ausführlicher in dem Buch (dt.) Beginnende reguläre Ausdrücke beschrieben .