RegExp.prototype[Symbol.matchAll]()

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.

RegExp 实例的 [Symbol.matchAll] 方法指定了 String.prototype.matchAll 的行为。

尝试一下

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("-[0-9]+", "g");
console.log("2016-01-02|2019-03-07".matchAll(re));
// Expected output: Array [Array ["-01"], Array ["-02"], Array ["-03"], Array ["-07"]]

语法

js
regexp[Symbol.matchAll](str)

参数

str

一个String的匹配对象。

返回值

一个迭代器

描述

本方法在String.prototype.matchAll()中被内部调用。例如,以下两个示例返回相同的结果。

js
"abc".matchAll(/a/);

/a/[Symbol.matchAll]("abc");

本方法用于自定义RegExp子类中的匹配行为。

示例

直接调用

本方法的使用方法几乎与 String.prototype.matchAll() 相同,除了 this 的不同以及参数顺序的差异。

js
var re = /[0-9]+/g;
var str = "2016-01-02";
var result = re[Symbol.matchAll](str);

console.log(Array.from(result, (x) => x[0]));
// ["2016", "01", "02"]

在子类中使用 [Symbol.matchAll]()

RegExp 的子类可以重写 [Symbol.matchAll]() 方法来修改默认行为。例如,返回一个数组而不是迭代器

js
class MyRegExp extends RegExp {
  [Symbol.matchAll](str) {
    var result = RegExp.prototype[Symbol.matchAll].call(this, str);
    if (!result) {
      return null;
    } else {
      return Array.from(result);
    }
  }
}

var re = new MyRegExp("([0-9]+)-([0-9]+)-([0-9]+)", "g");
var str = "2016-01-02|2019-03-07";
var result = str.matchAll(re);
console.log(result[0]); // [ "2016-01-02", "2016", "01", "02" ]
console.log(result[1]); // [ "2019-03-07", "2019", "03", "07" ]

浏览器兼容性

Report problems with this compatibility data on GitHub
desktopmobileserver
Chrome
Edge
Firefox
Opera
Safari
Chrome Android
Firefox for Android
Opera Android
Safari on iOS
Samsung Internet
WebView Android
WebView on iOS
Deno
Node.js
[Symbol.matchAll]

Legend

Tip: you can click/tap on a cell for more information.

Full support
Full support

参见