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%

另请参阅