RegExp.prototype[@@match]()

[@@match]() メソッドは、文字列正規表現に一致した部分を取得します。

試してみましょう

構文

regexp[Symbol.match](str)

引数

str

一致の対象となる String

返値

一致した全体の結果と括弧が捕捉した一致箇所の結果を含む Array。一致するものがなかった場合は、null

解説

このメソッドは、String.prototype.match() で内部的に呼び出されます。

たとえば、次の 2 つの例は同じ結果を返します。

'abc'.match(/a/);

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

このメソッドは、RegExp サブクラス内で一致の振る舞いをカスタマイズするために存在しています。

直接呼び出し

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

let re = /[0-9]+/g;
let str = '2016-01-02';
let result = re[Symbol.match](str);
console.log(result);  // ["2016", "01", "02"]

サブクラスで @@match を使用

RegExp のサブクラスは、既定の動作を修正するために [@@match]() メソッドをオーバーライドできます。

class MyRegExp extends RegExp {
  [Symbol.match](str) {
    let result = RegExp.prototype[Symbol.match].call(this, str);
    if (!result) return null;
    return {
      group(n) {
        return result[n];
      }
    };
  }
}

let re = new MyRegExp('([0-9]+)-([0-9]+)-([0-9]+)');
let str = '2016-01-02';
let result = str.match(re); // String.prototype.match calls re[@@match].
console.log(result.group(1)); // 2016
console.log(result.group(2)); // 01
console.log(result.group(3)); // 02

仕様書

Specification
ECMAScript Language Specification
# sec-regexp.prototype-@@match

ブラウザーの互換性

BCD tables only load in the browser

関連情報