RegExp.prototype[Symbol.matchAll]()
基线 广泛可用
此功能已非常成熟,可以在许多设备和浏览器版本上运行。它自 2015年7月.
报告反馈
试一试
语法
[Symbol.matchAll]()
方法是 RegExp
实例的属性,指定 String.prototype.matchAll
的行为方式。regexp[Symbol.matchAll](str)
js
参数
-
str
要匹配的 String
。
返回值
描述
匹配项的 可迭代迭代器对象(不可重启)。每个匹配项都是一个数组,其形状与 RegExp.prototype.exec()
的返回值相同。
[Symbol.matchAll]()
方法是 RegExp
实例的属性,指定 String.prototype.matchAll
的行为方式。"abc".matchAll(/a/g);
/a/g[Symbol.matchAll]("abc");
此方法在 String.prototype.matchAll()
中内部调用。例如,以下两个示例返回相同的结果。
[Symbol.matchAll]()
方法是 RegExp
实例的属性,指定 String.prototype.matchAll
的行为方式。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" ]
与 [Symbol.split]()
一样,[Symbol.matchAll]()
首先使用 [Symbol.species]
创建一个新的正则表达式,从而避免以任何方式修改原始正则表达式。lastIndex
从原始正则表达式的值开始。
输入是否为全局正则表达式的验证发生在 String.prototype.matchAll()
中。[Symbol.matchAll]()
不会验证输入。如果正则表达式不是全局的,则返回的迭代器会生成 exec()
结果一次,然后返回 undefined
。如果正则表达式是全局的,则每次调用返回的迭代器的 next()
方法时,都会调用正则表达式的 exec()
,并生成结果。
[Symbol.matchAll]()
方法是 RegExp
实例的属性,指定 String.prototype.matchAll
的行为方式。console.log(Array.from("ab-c".matchAll(/[abc]/gy)));
// [ [ "a" ], [ "b" ] ]
当正则表达式同时具有粘性(sticky)和全局(global)特性时,它仍然会执行粘性匹配 - 即它不会匹配 lastIndex
之后的任何匹配项。
[Symbol.matchAll]()
方法是 RegExp
实例的属性,指定 String.prototype.matchAll
的行为方式。console.log(Array.from("😄".matchAll(/(?:)/g)));
// [ [ "" ], [ "" ], [ "" ] ]
console.log(Array.from("😄".matchAll(/(?:)/gu)));
// [ [ "" ], [ "" ] ]
如果当前匹配项为空字符串,则lastIndex
仍然会向前移动。如果正则表达式具有u
标志,则它会向前移动一个 Unicode 代码点;否则,它会向前移动一个 UTF-16 代码点。
示例
此方法是为了在 RegExp
子类中自定义 matchAll()
的行为。
直接调用
[Symbol.matchAll]()
方法是 RegExp
实例的属性,指定 String.prototype.matchAll
的行为方式。const re = /[0-9]+/g;
const str = "2016-01-02";
const result = re[Symbol.matchAll](str);
console.log(Array.from(result, (x) => x[0]));
// [ "2016", "01", "02" ]
此方法的使用方式与 String.prototype.matchAll()
几乎相同,区别在于 this
的值和参数的顺序不同。
在子类中使用 [Symbol.matchAll]()
RegExp
的子类可以覆盖 [Symbol.matchAll]()
方法来修改默认行为。
[Symbol.matchAll]()
方法是 RegExp
实例的属性,指定 String.prototype.matchAll
的行为方式。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("([0-9]+)-([0-9]+)-([0-9]+)", "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" ]
规范
例如,要返回一个 Array 而不是一个 迭代器 |
---|
规范 # ECMAScript 语言规范 |
浏览器兼容性
sec-regexp-prototype-%symbol.matchall%