Wenn ich das mache:
/([^\/]+)+/g.exec('/a/b/c/d');
Ich verstehe das:
["a", "a"]
Aber wenn ich das mache:
'/a/b/c/d'.match(/([^\/]+)+/g);
Dann bekomme ich das erwartete Ergebnis davon:
["a", "b", "c", "d"]
Was ist der Unterschied?
javascript
regex
Justin Warkentin
quelle
quelle
exec
, um alle Unterauswahlen zu erhalten.+
nicht benötigt wird, damatch
alle Unterausdrücke bereits zurückgegeben werden..exec
Gibt jedes Mal nur eine zurück, daher wird dies auch nicht benötigt+
.Antworten:
exec
mit einem globalen regulären Ausdruck soll in einer Schleife verwendet werden, da weiterhin alle übereinstimmenden Unterausdrücke abgerufen werden. So:String.match
erledigt dies für Sie und verwirft die erfassten Gruppen.quelle
while(match = /[^\/]+/g.exec('/a/b/c/d')
einfügen, da sonst eine Endlosschleife entsteht. Wie es in der MDN developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…new RegExp("pattern")
und/pattern/
bedeutete verschiedene Dinge.Ein Bild ist besser, weißt du ...
Sieh den Unterschied?
quelle
/regex/.exec()
Gibt nur die erste gefundene Übereinstimmung zurück, während"string".match()
alle zurückgegeben werden, wenn Sie dasg
Flag in der Regex verwenden.Siehe hier: exec , match .
quelle
Wenn Ihre Regex global ist und Sie erfassen, müssen Sie exec verwenden. Match gibt nicht alle Ihre Aufnahmen zurück.
Match funktioniert hervorragend, wenn nur Matching (nicht Capturing). Sie führen es einmal aus und es gibt eine Reihe aller Übereinstimmungen. (Wenn der reguläre Ausdruck jedoch nicht global ist, zeigt die Übereinstimmung die Übereinstimmung an, gefolgt von den Erfassungen.)
Exec ist das, was Sie beim Erfassen verwenden, und jedes Mal, wenn es ausgeführt wird, gibt es die Übereinstimmung, gefolgt von den Erfassungen. (Die Übereinstimmung verhält sich so, dass die vollständige Übereinstimmung gefolgt von Erfassungen nur dann angezeigt wird, wenn der reguläre Ausdruck nicht global ist.)
Eine andere Verwendung mit Exec besteht darin, den Index oder die Position einer Übereinstimmung abzurufen. Wenn Sie eine Variable für Ihren regulären Ausdruck haben, können Sie .lastIndex verwenden und die Position des Abgleichs abrufen. Ein Regex-Objekt hat .lastIndex, und das Regex-Objekt ist das, worauf Sie .exec ausführen. Die Punktübereinstimmung wird für eine Zeichenfolge durchgeführt, und Sie können dann kein Regex-Objekt dot lastIndex ausführen
Ein String hat die Match-Funktion, der ein Regex übergeben wird. Und ein Regex hat die Exec-Funktion und erhält eine Zeichenfolge
exec Sie mehrmals ausführen. Match laufen Sie einmal
Es ist gut, Match zu verwenden, wenn Sie nicht erfassen, und wenn Sie erfassen, können Sie exec verwenden, das leistungsfähiger ist, da es gut zum Abrufen von Captures geeignet ist. Wenn Sie jedoch Match beim Capturing verwendet haben, sehen Sie, dass Captures angezeigt werden, wenn der reguläre Ausdruck nicht global ist, dies jedoch nicht Es werden keine Erfassungen angezeigt, wenn der reguläre Ausdruck global ist.
Eine andere Sache ist, dass wenn Sie exec verwenden, beachten Sie, dass auf dem regulären Ausdruck aufgerufen wird, und wenn Sie eine Variable für den regulären Ausdruck verwendet haben, Sie mehr Leistung haben
Sie erhalten keine Übereinstimmungen, wenn Sie die Variable nicht für den regulären Ausdruck verwenden. Verwenden Sie daher die Variable für den regulären Ausdruck, wenn Sie exec verwenden
Und mit exec können Sie den "Index" des Spiels erhalten
Wenn Sie also Indizes oder Erfassungen wünschen, verwenden Sie exec (denken Sie daran, dass der "Index", wie Sie sehen, beim "Index" tatsächlich ein n-tes Vorkommen ist und von 1 zählt. Sie können also das richtige ableiten Index durch Subtrahieren von 1. Und wie Sie sehen können, gibt es 0 - lastIndex von 0 - für nicht gefunden).
Und wenn Sie Übereinstimmungen strecken möchten, können Sie sie beim Erfassen verwenden, aber nicht, wenn der reguläre Ausdruck global ist, und wenn Sie dies dafür tun, ist der Inhalt des Arrays nicht alle Übereinstimmungen, sondern vollständig Match gefolgt von den Captures.
quelle
r.lastIndex
ist der Schlüsselfaktor, um den Unterschied zwischenexec
und zu verstehenmatch
.If your regex is global, and you are capturing, then you must use exec. Match won't return all your captures.
Ich habe es auf der Konsole. Kopieren Sie einfach"a,b,c,aa,bb,cc".match(/(\w+)/g);
Opera, Firefox."a,b,c,aa,bb,cc".match(/(\w+)/g)
Was dort passiert, werden alle Übereinstimmungen angezeigt, und es kommt einfach so vor, dass Sie jede Übereinstimmung erfasst haben Wenn es alle Aufnahmen zeigen würde, würde es genau gleich aussehen (cntd)Die Funktion .match ()
str.match(regexp)
führt folgende Aktionen aus :g
Flag wird in der regexp verwendet: es wird wieder alle Teile (ohne Berücksichtigung Einfanggruppen)g
Flag im regulären Ausdruck nicht verwendet wird, wird dasselbe wie zurückgegebenregexp.exec(str)
null
Beispiele von .match () mit dem
g
Flag:Und .match () ohne
g
Flag entspricht .exec () :Die Funktion .exec ()
regexp.exec(str)
führt folgende Aktionen aus :g
Flag wird in dem regulären Ausdruck verwendet: es wird wieder (für jedes Mal aufgerufen wird) :[N_MatchedStr, N_Captured1, N_Captured2, ...]
beim nächstenN
Spiel. Wichtig: Es wird nicht in die nächste Übereinstimmung übergehen, wenn das reguläre Ausdrucksobjekt nicht in einer Variablen gespeichert ist (es muss dasselbe Objekt sein).g
Flagge nicht ist im regulären Ausdruck verwendet wird: Es gibt dasselbe zurück, als hätte es eing
Flag und wurde zum ersten Mal und nur einmal aufgerufen.null
Beispiel für .exec () (gespeicherter regulärer Ausdruck + unter Verwendung des
g
Flags = ändert sich bei jedem Aufruf):Beispiele für .exec (), wenn es sich nicht bei jedem Aufruf ändert:
quelle
Manchmal dauert regex.exec () viel länger als string.match ().
Es ist erwähnenswert, dass regex.exec () zwischen x2 und x30 liegt, wenn das Ergebnis von string.match () und regex.exec () identisch ist (z. B. wenn kein \ g-Flag verwendet wird). Spiel():
Daher sollte in solchen Fällen die Verwendung des Ansatzes "new RegExp (). Exec ()" nur verwendet werden, wenn Sie eine globale Regex benötigen (dh mehr als einmal ausführen müssen).
quelle