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.

6

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" wobei n die n-te Erfassungsgruppe ist (ab 1 )
  • Das n-te Argument in einer Rückruffunktion
  • Wenn der RegExp nicht mit g , ist das n + 1-te Element in einem zurückgegebenen str.match Array
  • Wenn der RegExp mit g , verwirft str.match Captures. Verwenden re.exec stattdessen re.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


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow