A RetroSearch Logo

Home - News ( United States | United Kingdom | Italy | Germany ) - Football scores

Search Query:

Showing content from https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/RegExp/Symbol.replace below:

RegExp.prototype[Symbol.replace]() - JavaScript | MDN

RegExp.prototype[Symbol.replace]()

Baseline Widely available

[Symbol.replace]() は RegExp インスタンスのメソッドで、正規表現がパターンとして渡されたときに String.prototype.replace() およびString.prototype.replaceAll() がどのように動作するかを指定します。

試してみましょう
class RegExp1 extends RegExp {
  [Symbol.replace](str) {
    return RegExp.prototype[Symbol.replace].call(this, str, "#!@?");
  }
}

console.log("football".replace(new RegExp1("foo")));
// Expected output: "#!@?tball"
構文
regexp[Symbol.replace](str, replacement)
引数
str

置換の対象となる文字列 (String) です。

replacement

文字列または関数を取ることができます。

返値

一部またはすべてのパターンの一致箇所が置換内容によって置き換えられた新しい文字列です。

解説

このメソッドは String.prototype.replace() の中で、 pattern 引数が RegExp オブジェクトであった場合に内部的に呼び出されます。たとえば、次の 2 つの例は同じ結果を返します。

"abc".replace(/a/, "A");

/a/[Symbol.replace]("abc", "A");

正規表現がグローバル(g フラグ付き)である場合、正規表現の exec() メソッドは exec() が null を返すまで繰り返し呼び出されます。そうでない場合、exec() は一度だけ呼び出されます。それぞれの exec() の結果に対して、 String.prototype.replace() の解説に基づいて置き換える準備をします。

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

const re = /a/y;

for (let i = 0; i < 5; i++) {
  console.log("aaa".replace(re, "b"), re.lastIndex);
}

// baa 1
// aba 2
// aab 3
// aaa 0
// baa 1

正規表現が粘着的でグローバルな場合、粘着的に照合します。すなわち、 lastIndex 以降の出現には一致しません。

console.log("aa-a".replace(/a/gy, "b")); // "bb-a"

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

console.log("😄".replace(/(?:)/g, " ")); // " \ud83d \ude04 "
console.log("😄".replace(/(?:)/gu, " ")); // " 😄 "

このメソッドは、 RegExp サブクラスの置換動作をカスタマイズするために存在しています。

例 直接呼出し

this と引数の順序が異なる点を除いて、このメソッドは String.prototype.replace() とほとんど同じ使い方ができます。

const re = /-/g;
const str = "2016-01-01";
const newstr = re[Symbol.replace](str, ".");
console.log(newstr); // 2016.01.01
サブクラスでの [Symbol.replace]() の使用

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

class MyRegExp extends RegExp {
  constructor(pattern, flags, count) {
    super(pattern, flags);
    this.count = count;
  }
  [Symbol.replace](str, replacement) {
    // [Symbol.replace]() を `count` 回実行する
    let result = str;
    for (let i = 0; i < this.count; i++) {
      result = RegExp.prototype[Symbol.replace].call(this, result, replacement);
    }
    return result;
  }
}

const re = new MyRegExp("\\d", "", 3);
const str = "01234567";
const newstr = str.replace(re, "#"); // String.prototype.replace は re[Symbol.replace]() を呼び出す
console.log(newstr); // ###34567
仕様書 ブラウザーの互換性 関連情報

RetroSearch is an open source project built by @garambo | Open a GitHub Issue

Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo

HTML: 3.2 | Encoding: UTF-8 | Version: 0.7.4