RegExp.prototype[@@matchAll]()

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

構文

regexp[Symbol.matchAll](str)

引数

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

返値

イテレーターです。

解説

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

'abc'.matchAll(/a/);

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

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

直接呼び出し

このメソッドはほとんど String.prototype.matchAll() と同じ方法で使うことができますが、 this と引数の順序が異なります。

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

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

RegExp のサブクラスは [@@matchAll]() メソッドを上書きして既定の動作を変更することができます。例えば、 Arrayイテレーターの代わりに返すことができます。

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

仕様書

仕様書
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 未対応 なしWebView Android 完全対応 73Chrome Android 完全対応 73Firefox Android 完全対応 67Opera Android 完全対応 52Safari iOS 未対応 なしSamsung Internet Android 完全対応 5.0nodejs 完全対応 12.0.0

凡例

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

関連情報