Suche…
Syntax
- Lassen Sie Regex = / pattern / [ Flags ]
- let regex = new RegExp (' pattern ', [ flags ])
- Lassen Sie ismatch = regex.test (' text ')
- let results = regex.exec (' text ')
Parameter
Flaggen | Einzelheiten |
---|---|
G | g lobal. Alle Spiele (kehren Sie nicht beim ersten Spiel zurück). |
m | m ulti-line. Legt fest, dass ^ & $ mit dem Anfang / Ende jeder Zeile übereinstimmt (nicht nur Anfang / Ende der Zeichenfolge). |
ich | Ich bin empfindlich. Groß- und Kleinschreibung wird nicht berücksichtigt (ignoriert den Fall von [a-zA-Z]). |
u | u nicode: Musterzeichenfolgen werden als UTF-16 behandelt . Verursacht auch, dass Escape-Sequenzen mit Unicode-Zeichen übereinstimmen. |
y | stick y : stimmt nur mit dem Index überein, der in der lastIndex-Eigenschaft dieses regulären Ausdrucks in der Zielzeichenfolge angegeben ist (und versucht nicht, von späteren Indizes abzugleichen). |
Bemerkungen
Das RegExp-Objekt ist nur so nützlich, da Sie über regelmäßige Ausdrücke verfügen. Hier finden Sie eine einführende Einführung oder MDN für eine ausführlichere Erklärung.
RegExp-Objekt erstellen
Standarderstellung
Es wird empfohlen, dieses Formular nur zu verwenden, wenn Sie Regex aus dynamischen Variablen erstellen.
Verwenden Sie diese Option, wenn sich der Ausdruck ändern kann oder der Ausdruck vom Benutzer generiert wird.
var re = new RegExp(".*");
Mit Fahnen:
var re = new RegExp(".*", "gmi");
Mit einem Backslash: (Dies muss mit Escapezeichen versehen werden, da der reguläre Ausdruck mit einer Zeichenfolge angegeben wird.)
var re = new RegExp("\\w*");
Statische Initialisierung
Verwenden Sie diese Option, wenn Sie wissen, dass sich der reguläre Ausdruck nicht ändert, und Sie wissen, was der Ausdruck vor der Laufzeit ist.
var re = /.*/;
Mit Fahnen:
var re = /.*/gmi;
Mit einem Backslash: (Dies sollte nicht mit Escapezeichen versehen werden, da der Regex in einem Literal angegeben ist.)
var re = /\w*/;
RegExp Flags
Sie können mehrere Flags angeben, um das RegEx-Verhalten zu ändern. Flags können an das Ende eines Regex-Literal angehängt werden, z. B. durch Angabe von gi
in /test/gi
, oder sie können als zweites Argument für den RegExp
Konstruktor angegeben werden, wie im new RegExp('test', 'gi')
.
g
- global. Findet alle Übereinstimmungen, anstatt nach dem ersten zu stoppen.
i
- Fall ignorieren /[az]/i
ist äquivalent zu /[a-zA-Z]/
.
m
- mehrzeilig. ^
und $
stimmen mit dem Anfang und dem Ende jeder Zeile überein und behandeln \n
und \r
als Trennzeichen anstatt nur den Anfang und das Ende der gesamten Zeichenfolge.
u
- Unicode. Wenn dieses Flag nicht unterstützt wird, müssen Sie bestimmte Unicode-Zeichen mit \uXXXX
wobei XXXX
der Wert des Zeichens im Hexadezimalwert ist.
y
- Findet alle aufeinanderfolgenden / benachbarten Übereinstimmungen.
Übereinstimmung mit .exec ()
.exec()
mit .exec()
RegExp.prototype.exec(string)
gibt ein Array von Captures zurück, oder null
wenn keine Übereinstimmung gefunden wurde.
var re = /([0-9]+)[a-z]+/;
var match = re.exec("foo123bar");
match.index
ist 3, der Ort (auf Null basierend) des Matches.
match[0]
ist die vollständige Übereinstimmungszeichenfolge.
match[1]
ist der Text, der der ersten erfassten Gruppe entspricht. match[n]
wäre der Wert der n- ten erfassten Gruppe.
.exec()
mit .exec()
var re = /a/g;
var result;
while ((result = re.exec('barbatbaz')) !== null) {
console.log("found '" + result[0] + "', next exec starts at index '" + re.lastIndex + "'");
}
Erwartete Ausgabe
'a' gefunden, nächster Exec startet am Index '2'
'a' gefunden, nächster Exec startet am Index '5'
'a' gefunden, nächster Exec startet am Index '8'
Überprüfen Sie, ob die Zeichenfolge ein Muster enthält, das .test () verwendet.
var re = /[a-z]+/;
if (re.test("foo")) {
console.log("Match exists.");
}
Die test
führt eine Suche durch, um festzustellen, ob ein regulärer Ausdruck mit einer Zeichenfolge übereinstimmt. Der reguläre Ausdruck [az]+
sucht nach einem oder mehreren Kleinbuchstaben. Da das Muster mit der Zeichenfolge übereinstimmt, wird „Übereinstimmung vorhanden“ in der Konsole protokolliert.
RegExp mit Strings verwenden
Das String-Objekt verfügt über die folgenden Methoden, die reguläre Ausdrücke als Argumente akzeptieren.
-
"string".match(...
-
"string".replace(...
-
"string".split(...
-
"string".search(...
Übereinstimmung mit RegExp
console.log("string".match(/[i-n]+/));
console.log("string".match(/(r)[i-n]+/));
Erwartete Ausgabe
Array ["in"]
Array ["rin", "r"]
Durch RegExp ersetzen
console.log("string".replace(/[i-n]+/, "foo"));
Erwartete Ausgabe
Strfoog
Mit RegExp teilen
console.log("stringstring".split(/[i-n]+/));
Erwartete Ausgabe
Array ["str", "gstr", "g"]
Suche mit RegExp
.search()
gibt den Index zurück, an dem eine Übereinstimmung gefunden wird, oder -1.
console.log("string".search(/[i-n]+/));
console.log("string".search(/[o-q]+/));
Erwartete Ausgabe
3
-1
String-Übereinstimmung durch eine Rückruffunktion ersetzen
String#replace
kann als zweites Argument eine Funktion haben, sodass Sie eine Ersetzung basierend auf einer bestimmten Logik angeben können.
"Some string Some".replace(/Some/g, (match, startIndex, wholeString) => {
if(startIndex == 0){
return 'Start';
} else {
return 'End';
}
});
// will return Start string End
Eine Zeilenvorlagenbibliothek
let data = {name: 'John', surname: 'Doe'}
"My name is {surname}, {name} {surname}".replace(/(?:{(.+?)})/g, x => data[x.slice(1,-1)]);
// "My name is Doe, John Doe"
RegExp-Gruppen
JavaScript unterstützt verschiedene Gruppentypen in seinen regulären Ausdrücken, Capture-Gruppen , Nicht-Capture-Gruppen und Look-Aheads . Derzeit gibt es keinen Look-Behind- Support.
Erfassung
Manchmal hängt das gewünschte Spiel vom Kontext ab. Das bedeutet , ein einfaches RegExp wird das Stück der Schnur über finden , die von Interesse ist, so dass die Lösung ist es, eine Capture - Gruppe zu schreiben (pattern)
. Die erfassten Daten können dann als ... referenziert werden.
- String-Ersetzung
"$n"
wobein
die n-te Erfassungsgruppe ist (ab1
) - Das n-te Argument in einer Rückruffunktion
- Wenn der RegExp nicht mit
g
, ist das n + 1-te Element in einem zurückgegebenenstr.match
Array - Wenn der RegExp mit
g
, verwirftstr.match
Captures. Verwendenre.exec
stattdessenre.exec
Angenommen, es gibt einen String, bei dem alle +
-Zeichen durch ein Leerzeichen ersetzt werden müssen, jedoch nur, wenn sie einem Buchstabenzeichen folgen. Dies bedeutet, dass eine einfache Übereinstimmung dieses Buchstabenzeichen enthalten würde und auch entfernt werden würde. Die Erfassung ist die Lösung, da der übereinstimmende Brief erhalten bleiben kann.
let str = "aa+b+cc+1+2",
re = /([a-z])\+/g;
// String replacement
str.replace(re, '$1 '); // "aa b cc 1+2"
// Function replacement
str.replace(re, (m, $1) => $1 + ' '); // "aa b cc 1+2"
Nicht erfassen
Mithilfe des Formulars (?:pattern)
funktionieren diese auf ähnliche Weise wie Gruppen, jedoch werden die Inhalte der Gruppe nach der Übereinstimmung nicht gespeichert.
Sie können besonders nützlich sein, wenn andere Daten erfasst werden, für die Sie die Indizes nicht verschieben möchten, sondern einen erweiterten Musterabgleich durchführen müssen, z. B. ein ODER
let str = "aa+b+cc+1+2",
re = /(?:\b|c)([a-z])\+/g;
str.replace(re, '$1 '); // "aa+b c 1+2"
Schau voraus
Wenn das gewünschte Match von etwas abhängt, das ihm folgt, anstatt es abzugleichen und zu erfassen, ist es möglich, einen Look-Ahead zu verwenden, um darauf zu testen, aber nicht in das Match aufzunehmen. Ein positiver Vorausblick hat die Form (?=pattern)
, ein negativer Vorausblick (wobei der Ausdruck nur dann übereinstimmt, wenn das Vorausschaumuster nicht übereinstimmt) die Form (?!pattern)
let str = "aa+b+cc+1+2",
re = /\+(?=[a-z])/g;
str.replace(re, ' '); // "aa b cc+1+2"
Verwenden von Regex.exec () mit Klammern regulärer Ausdruck, um Übereinstimmungen einer Zeichenfolge zu extrahieren
Manchmal möchten Sie die Zeichenfolge nicht einfach ersetzen oder entfernen. Manchmal möchten Sie Übereinstimmungen extrahieren und verarbeiten. Hier ein Beispiel, wie Sie Übereinstimmungen manipulieren.
Was ist ein Spiel? Wenn eine kompatible Teilzeichenfolge für den gesamten regulären Ausdruck in der Zeichenfolge gefunden wird, erzeugt der Befehl exec eine Übereinstimmung. Eine Übereinstimmung ist ein Array, das sich aus dem gesamten übereinstimmenden Teilstring und allen Klammern in der Übereinstimmung zusammensetzt.
Stellen Sie sich einen HTML-String vor:
<html>
<head></head>
<body>
<h1>Example</h1>
<p>Look a this great link : <a href="https://stackoverflow.com">Stackoverflow</a> http://anotherlinkoutsideatag</p>
Copyright <a href="https://stackoverflow.com">Stackoverflow</a>
</body>
Sie möchten extrahieren und alle Links in a
Tag erhalten. Zuerst schreiben Sie hier die Regex:
var re = /<a[^>]*href="https?:\/\/.*"[^>]*>[^<]*<\/a>/g;
Aber stellen Sie sich vor, Sie wollen die href
und den anchor
jedes Links. Und du willst es zusammen haben. Sie können einfach einen neuen Regex für jede Übereinstimmung hinzufügen ODER Sie können Klammern verwenden:
var re = /<a[^>]*href="(https?:\/\/.*)"[^>]*>([^<]*)<\/a>/g;
var str = '<html>\n <head></head>\n <body>\n <h1>Example</h1>\n <p>Look a this great link : <a href="https://stackoverflow.com">Stackoverflow</a> http://anotherlinkoutsideatag</p>\n\n Copyright <a href="https://stackoverflow.com">Stackoverflow</a>\n </body>\';\n';
var m;
var links = [];
while ((m = re.exec(str)) !== null) {
if (m.index === re.lastIndex) {
re.lastIndex++;
}
console.log(m[0]); // The all substring
console.log(m[1]); // The href subpart
console.log(m[2]); // The anchor subpart
links.push({
match : m[0], // the entire match
href : m[1], // the first parenthesis => (https?:\/\/.*)
anchor : m[2], // the second one => ([^<]*)
});
}
Am Ende der Schleife haben Sie ein Array mit anchor
und href
mit dem Sie beispielsweise markdown schreiben können:
links.forEach(function(link) {
console.log('[%s](%s)', link.anchor, link.href);
});
Um weiter zu gehen:
- Verschachtelte Klammern