Mit String
‚s match()
Funktion gibt Gruppen nicht erfasst , wenn die globale Modifikator gesetzt ist, wie Sie herausgefunden haben.
In diesem Fall möchten Sie ein RegExp
Objekt verwenden und dessen exec()
Funktion aufrufen . String
's match()
ist fast identisch mit RegExp
' s exec()
Funktion ... außer in solchen Fällen. Wenn der globale Modifikator festgelegt ist, gibt die normale match()
Funktion keine erfassten Gruppen zurück, während RegExp
die exec()
Funktion dies tut. ( Hier unter anderem notiert.)
Ein weiterer wichtiger Punkt ist, dass exec()
die Übereinstimmungen nicht in einem großen Array zurückgegeben werden. Es werden weiterhin Übereinstimmungen zurückgegeben, bis sie abgelaufen sind. In diesem Fall werden sie zurückgegeben null
.
So könnten Sie beispielsweise Folgendes tun:
var pattern = /t(e)(s)t/g;
var match;
while (match = pattern.exec(text)) {
}
Eine andere Sache zu beachten ist , dass RegExp.prototype.exec()
und RegExp.prototype.test()
den regulären Ausdruck auf der mitgelieferten String auszuführen und das erste Ergebnis zurück. Bei jedem sequentiellen Aufruf wird die Aktualisierung der Ergebnismenge RegExp.prototype.lastIndex
basierend auf der aktuellen Position in der Zeichenfolge schrittweise durchgeführt .
Hier ist ein Beispiel: // Denken Sie daran, dass das Beispiel und das Muster 4 Übereinstimmungen enthalten. lastIndex beginnt bei 0
pattern.test(text);
pattern.test(text);
pattern.exec(text);
pattern.exec(text);
while (var match = pattern.exec(text)) {
console.log(match);
}
pattern.test(text);
pattern.test(text);
pattern.lastIndex = 0;
while (var match = pattern.exec(text)) {
console.log(match);
}
Sie finden Informationen zur Verwendung von RegExp
Objekten im MDN (insbesondere hier die Dokumentation für die exec()
Funktion ).
.test()
zuvor verwenden, stellen Sie sicher, dass Sie den lastIndexpattern.lastIndex = 0
vor derwhile
Schleife zurücksetzen , um alle Übereinstimmungen zu erhalten'foobar'.match(/f(o)*(ba)/)
wird zurückkehren["fooba", "o", "ba"]
.Ich bin überrascht zu sehen, dass ich die erste Person bin, die diese Frage mit der Antwort beantwortet, nach der ich vor 10 Jahren gesucht habe (die Antwort gab es noch nicht). Ich hatte auch gehofft, dass die eigentlichen Spezifikationsschreiber es vor mir beantwortet hätten;).
.matchAll wurde bereits einigen Browsern hinzugefügt.
Im modernen Javascript können wir dies jetzt erreichen, indem wir einfach Folgendes tun.
let result = [...text.matchAll(/t(e)(s)t/g)];
.matchAll spec
.matchAll docs
Ich verwalte jetzt eine isomorphe Javascript-Bibliothek, die bei vielen dieser Arten der String-Analyse hilft. Sie können es hier überprüfen: Saitensäge . Es hilft dabei, die Verwendung von .matchAll zu vereinfachen, wenn benannte Erfassungsgruppen verwendet werden.
Ein Beispiel wäre
saw(text).matchAll(/t(e)(s)t/g)
Dies gibt eine benutzerfreundlichere Reihe von Übereinstimmungen aus, und wenn Sie Lust haben, können Sie benannte Erfassungsgruppen einwerfen und eine Reihe von Objekten erhalten.
quelle