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.
> "azb".match(/a(z)b/);
[ "azb", "z" ]
> "azb".match(/a(z)b/g);
[ "azb" ]
>
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
> /./g.exec("abc")
[ "a" ]
> /./g.exec("abc")
[ "a" ]
> /./g.exec("abc")
[ "a" ]
>
> /[a-c]/g.exec("abc")
[ "a" ]
> /[a-c]/g.exec("abc")
[ "a" ]
>
> var r=/[a-c]/g
> r.exec("abc")
[ "a" ]
> r.exec("abc")
[ "b" ]
> r.exec("abc")
[ "c" ]
> r.exec("abc")
null
>
Und mit exec können Sie den "Index" des Spiels erhalten
> var r=/T/g
> r.exec("qTqqqTqqTq");
[ "T" ]
> r.lastIndex
2
> r.exec("qTqqqTqqTq");
[ "T" ]
> r.lastIndex
6
> r.exec("qTqqqTqqTq");
[ "T" ]
> r.lastIndex
9
> r.exec("qTqqqTqqTq");
null
> r.lastIndex
0
>
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.
exec
, um alle Unterauswahlen zu erhalten.