RegExp.prototype[@@matchAll]()

[@@matchAll] メソッドは、文字列に対する正規表現で一致するすべてのものを返します。

構文

regexp[Symbol.matchAll](str)

引数

str
一致の対象となる String です。

返値

イテレーターです。

解説

このメソッドは内部的に String.prototype.matchAll() を呼び出します。例えば、以下の2つの例は同じ結果を返します。

'abc'.matchAll(/a/);

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

このメソッドは matchAll() の動作を RegExp のサブクラスの中でカスタマイズするために存在します。

直接呼び出し

このメソッドは String.prototype.matchAll(), とほぼ同様に使用することができますが、 this の値と引数の順序が違う点が異なります。

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

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

サブクラスでの @@matchAll の使用

RegExp のサブクラスは [@@matchAll]() メソッドを上書きして既定の動作を変更することができます。

例えば、 Arrayイテレーターの代わりに返すことができます。

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

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" ]

仕様書

仕様書
ECMAScript (ECMA-262)
RegExp.prototype[@@matchAll] の定義

ブラウザーの互換性

Update compatibility data on GitHub
デスクトップモバイルサーバー
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewAndroid 版 ChromeAndroid 版 FirefoxAndroid 版 OperaiOSのSafariSamsung InternetNode.js
@@matchAllChrome 完全対応 73Edge 完全対応 79Firefox 完全対応 67IE 未対応 なしOpera 完全対応 60Safari 完全対応 13WebView Android 完全対応 73Chrome Android 完全対応 73Firefox Android 完全対応 67Opera Android 完全対応 52Safari iOS 完全対応 13Samsung Internet Android 完全対応 5.0nodejs 完全対応 12.0.0

凡例

完全対応  
完全対応
未対応  
未対応

関連情報