Baseline Widely available
Die matchAll()
-Methode von String
-Werten gibt einen Iterator für alle Ergebnisse zurück, die dieser Zeichenkette mit einem regulären Ausdruck entsprechen, einschlieÃlich Capturing-Gruppen.
const regexp = /t(e)(st(\d?))/g;
const str = "test1test2";
const array = [...str.matchAll(regexp)];
console.log(array[0]);
// Expected output: Array ["test1", "e", "st1", "1"]
console.log(array[1]);
// Expected output: Array ["test2", "e", "st2", "2"]
Syntax Parameter
regexp
Ein reguläres Ausdrucksobjekt oder ein beliebiges Objekt, das eine Symbol.matchAll
-Methode hat.
Wenn regexp
kein RegExp
-Objekt ist und keine Symbol.matchAll
-Methode hat, wird es implizit in ein RegExp
umgewandelt, indem new RegExp(regexp, 'g')
verwendet wird.
Wenn regexp
ein Regex ist, dann muss es das globale (g
)-Flag gesetzt haben, sonst wird ein TypeError
ausgelöst.
Ein iterables Iterator-Objekt (das nicht neu gestartet werden kann) von Ãbereinstimmungen oder ein leerer Iterator, wenn keine Ãbereinstimmungen gefunden werden. Jeder vom Iterator zurückgegebene Wert ist ein Array mit derselben Form wie der Rückgabewert von RegExp.prototype.exec()
.
TypeError
Wird ausgelöst, wenn das regexp
ein Regex ist, das nicht das globale (g
)-Flag gesetzt hat (seine flags
-Eigenschaft enthält kein "g"
).
Die Implementierung von String.prototype.matchAll
macht nicht viel mehr, als die Symbol.matchAll
-Methode des Arguments mit der Zeichenkette als erstem Parameter aufzurufen (abgesehen von der zusätzlichen Eingabevalidierung, dass der Regex global ist). Die eigentliche Implementierung kommt von RegExp.prototype[Symbol.matchAll]()
.
Ohne matchAll()
ist es möglich, Aufrufe von regexp.exec()
(und Regexe mit dem g
-Flag) in einer Schleife zu verwenden, um alle Ãbereinstimmungen zu erhalten:
const regexp = /foo[a-z]*/g;
const str = "table football, foosball";
let match;
while ((match = regexp.exec(str)) !== null) {
console.log(
`Found ${match[0]} start=${match.index} end=${regexp.lastIndex}.`,
);
}
// Found football start=6 end=14.
// Found foosball start=16 end=24.
Mit matchAll()
können Sie die while
-Schleife und exec
mit g
vermeiden. Stattdessen erhalten Sie einen Iterator, den Sie mit den bequemeren for...of
, Array Spread oder Array.from()
-Konstruktionen verwenden können:
const regexp = /foo[a-z]*/g;
const str = "table football, foosball";
const matches = str.matchAll(regexp);
for (const match of matches) {
console.log(
`Found ${match[0]} start=${match.index} end=${
match.index + match[0].length
}.`,
);
}
// Found football start=6 end=14.
// Found foosball start=16 end=24.
// matches iterator is exhausted after the for...of iteration
// Call matchAll again to create a new iterator
Array.from(str.matchAll(regexp), (m) => m[0]);
// [ "football", "foosball" ]
matchAll
wird eine Ausnahme auslösen, wenn das g
-Flag fehlt.
const regexp = /[a-c]/;
const str = "abc";
str.matchAll(regexp);
// TypeError
matchAll
erstellt intern eine Kopie des regexp
â anders als bei regexp.exec()
ändert sich lastIndex
nicht, während die Zeichenkette durchsucht wird.
const regexp = /[a-c]/g;
regexp.lastIndex = 1;
const str = "abc";
Array.from(str.matchAll(regexp), (m) => `${regexp.lastIndex} ${m[0]}`);
// [ "1 b", "1 c" ]
Dies bedeutet jedoch, dass Sie im Gegensatz zur Verwendung von regexp.exec()
in einer Schleife lastIndex
nicht ändern können, um das Regex vor- oder zurückzusetzen.
Ein weiterer überzeugender Grund für matchAll
ist der verbesserte Zugang zu Capturing-Gruppen.
Capturing-Gruppen werden ignoriert, wenn match()
mit dem globalen g
-Flag verwendet wird:
const regexp = /t(e)(st(\d?))/g;
const str = "test1test2";
str.match(regexp); // ['test1', 'test2']
Mit matchAll
können Sie leicht auf Capturing-Gruppen zugreifen:
const array = [...str.matchAll(regexp)];
array[0];
// ['test1', 'e', 'st1', '1', index: 0, input: 'test1test2', length: 4]
array[1];
// ['test2', 'e', 'st2', '2', index: 5, input: 'test1test2', length: 4]
Verwendung von matchAll() mit einem Nicht-RegExp-Objekt, das [Symbol.matchAll]()
implementiert
Wenn ein Objekt eine Symbol.matchAll
-Methode hat, kann es als benutzerdefinierter Matcher verwendet werden. Der Rückgabewert von Symbol.matchAll
wird zum Rückgabewert von matchAll()
.
const str = "Hmm, this is interesting.";
str.matchAll({
[Symbol.matchAll](str) {
return [["Yes, it's interesting."]];
},
}); // returns [["Yes, it's interesting."]]
Spezifikationen Browser-Kompatibilität Siehe auch
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4