Baseline Widely available
Die Methode [Symbol.matchAll]()
von RegExp
-Instanzen gibt an, wie String.prototype.matchAll
verhalten sollte.
class MyRegExp extends RegExp {
[Symbol.matchAll](str) {
const result = RegExp.prototype[Symbol.matchAll].call(this, str);
if (!result) {
return null;
}
return Array.from(result);
}
}
const re = new MyRegExp("-\\d+", "g");
console.log("2016-01-02|2019-03-07".matchAll(re));
// Expected output: Array [Array ["-01"], Array ["-02"], Array ["-03"], Array ["-07"]]
Syntax
regexp[Symbol.matchAll](str)
Parameter
str
Ein String
, der das Ziel des Abgleichs darstellt.
Ein iterierbares Iterator-Objekt (das nicht neu gestartet werden kann) der Ãbereinstimmungen. Jede Ãbereinstimmung ist ein Array mit derselben Struktur wie der Rückgabewert von RegExp.prototype.exec()
.
Diese Methode wird intern in String.prototype.matchAll()
aufgerufen. Zum Beispiel liefern die folgenden zwei Beispiele dasselbe Ergebnis.
"abc".matchAll(/a/g);
/a/g[Symbol.matchAll]("abc");
Ãhnlich wie [Symbol.split]()
beginnt [Symbol.matchAll]()
mit der Verwendung von [Symbol.species]
, um ein neues Regex zu konstruieren, um zu vermeiden, dass das ursprüngliche Regexp in irgendeiner Weise mutiert wird. lastIndex
beginnt mit dem Wert des ursprünglichen Regex.
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" ]
Die Validierung, dass die Eingabe ein globales Regex ist, erfolgt in String.prototype.matchAll()
. [Symbol.matchAll]()
validiert die Eingabe nicht. Wenn das Regex nicht global ist, gibt der zurückgegebene Iterator das exec()
-Ergebnis einmal zurück und gibt dann undefined
zurück. Wenn das Regexp global ist, wird jedes Mal, wenn die next()
-Methode des zurückgegebenen Iterators aufgerufen wird, das Regex' exec()
aufgerufen und das Ergebnis zurückgegeben.
Wenn das Regex sticky und global ist, führt es weiterhin Sticky-Matches durch â das heiÃt, es matcht keine Vorkommen nach dem lastIndex
.
console.log(Array.from("ab-c".matchAll(/[abc]/gy)));
// [ [ "a" ], [ "b" ] ]
Wenn die aktuelle Ãbereinstimmung ein leerer String ist, wird der lastIndex
dennoch vorgerückt. Wenn das Regex das u
-Flag hat, wird um einen Unicode-Codepoint vorgerückt; andernfalls um einen UTF-16-Codepoint.
console.log(Array.from("ð".matchAll(/(?:)/g)));
// [ [ "" ], [ "" ], [ "" ] ]
console.log(Array.from("ð".matchAll(/(?:)/gu)));
// [ [ "" ], [ "" ] ]
Diese Methode existiert, um das Verhalten von matchAll()
in RegExp
-Unterklassen anzupassen.
Diese Methode kann fast auf dieselbe Weise wie String.prototype.matchAll()
verwendet werden, abgesehen von dem unterschiedlichen Wert von this
und der unterschiedlichen Reihenfolge der Argumente.
const re = /\d+/g;
const str = "2016-01-02";
const result = re[Symbol.matchAll](str);
console.log(Array.from(result, (x) => x[0]));
// [ "2016", "01", "02" ]
Verwendung von [Symbol.matchAll]()
in Unterklassen
Unterklassen von RegExp
können die [Symbol.matchAll]()
-Methode überschreiben, um das Standardverhalten zu ändern.
Zum Beispiel, um ein Array
anstelle eines Iterator zurückzugeben:
class MyRegExp extends RegExp {
[Symbol.matchAll](str) {
const result = RegExp.prototype[Symbol.matchAll].call(this, str);
return result ? Array.from(result) : null;
}
}
const re = new MyRegExp("(\\d+)-(\\d+)-(\\d+)", "g");
const str = "2016-01-02|2019-03-07";
const result = str.matchAll(re);
console.log(result[0]);
// [ "2016-01-02", "2016", "01", "02" ]
console.log(result[1]);
// [ "2019-03-07", "2019", "03", "07" ]
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