Movatterモバイル変換


[0]ホーム

URL:


  1. 開発者向けのウェブ技術
  2. JavaScript
  3. JavaScript リファレンス
  4. 標準組み込みオブジェクト
  5. RegExp
  6. [Symbol.match]()

このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docsコミュニティーについてもっと知り、仲間になるにはこちらから。

View in EnglishAlways switch to English

RegExp.prototype[Symbol.match]()

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since ⁨2016年9月⁩.

[Symbol.match]()RegExp インスタンスのメソッドで、String.prototype.match() がどのように動作するのかを指定します。さらに、これが存在するかどうかが、そのオブジェクトが正規表現とみなされるかどうかにも影響します。

試してみましょう

class RegExp1 extends RegExp {  [Symbol.match](str) {    const result = RegExp.prototype[Symbol.match].call(this, str);    if (result) {      return "VALID";    }    return "INVALID";  }}console.log("2012-07-02".match(new RegExp1("(\\d+)-(\\d+)-(\\d+)")));// 予想される結果: "VALID"

構文

js
regexp[Symbol.match](str)

引数

str

文字列 (String) で、照合の対象となるものです。

返値

配列 (Array) で、内容はグローバル (g) フラグがあるかどうかで変わります。一致するものが見つからなければnull になります。

  • g フラグが使用された場合は、この正規表現全体に一致したすべての結果となりますが、キャプチャグループは含まれません。
  • g フラグが使用されなかった場合は、最初に一致したもの全体と、関連するキャプチャグループが返されます。この場合、match()RegExp.prototype.exec() (一部の追加のプロパティを配列で含む)の結果と同じになります。

解説

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

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

js
"abc".match(/a/);/a/[Symbol.match]("abc");

正規表現がグローバル(g フラグ付き)である場合、この正規表現のexec() メソッドは、exec()null を返すまで繰り返し呼び出されます。そうでない場合、exec() は一度だけ呼び出され、その結果が[Symbol.match]() の返値となります。

[Symbol.match]()exec()null が返るまで呼び出し続け、最後の照合に失敗すると自動的に正規表現のlastIndex を 0 にリセットします。しかし、正規表現が粘着的であるもののグローバルではない場合、lastIndex はリセットされません。この場合、match() を呼び出すたびに異なる結果を返すかもしれません。

js
const re = /[abc]/y;for (let i = 0; i < 5; i++) {  console.log("abc".match(re), re.lastIndex);}// [ 'a' ] 1// [ 'b' ] 2// [ 'c' ] 3// null 0// [ 'a' ] 1

正規表現が粘着的かつグローバルな場合、粘着的な照合、つまりlastIndex 以降の照合は行われません。

js
console.log("ab-c".match(/[abc]/gy)); // [ 'a', 'b' ]

もし現在の照合が空文字列であったとしても、lastIndex は進みます。正規表現がUnicode 対応モードであれば、Unicode のコードポイント 1 つ分進みます。そうでなければ、 UTF-16 コード単位分進みます。

js
console.log("😄".match(/(?:)/g)); // [ '', '', '' ]console.log("😄".match(/(?:)/gu)); // [ '', '' ]

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

さらに、[Symbol.match]() プロパティはオブジェクトが正規表現であるかどうかをチェックするために使われます。

直接呼び出し

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

js
const re = /\d+/g;const str = "2016-01-02";const result = re[Symbol.match](str);console.log(result); // ["2016", "01", "02"]

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

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

js
class MyRegExp extends RegExp {  [Symbol.match](str) {    const result = RegExp.prototype[Symbol.match].call(this, str);    if (!result) return null;    return {      group(n) {        return result[n];      },    };  }}const re = new MyRegExp("(\\d+)-(\\d+)-(\\d+)");const str = "2016-01-02";const result = str.match(re); // String.prototype.match は re[Symbol.match]() を呼び出すconsole.log(result.group(1)); // 2016console.log(result.group(2)); // 01console.log(result.group(3)); // 02

仕様書

Specification
ECMAScript® 2026 Language Specification
# sec-regexp.prototype-%symbol.match%

ブラウザーの互換性

関連情報

Help improve MDN

Learn how to contribute

This page was last modified on byMDN contributors.


[8]ページ先頭

©2009-2025 Movatter.jp