【JSリファレンス】RegExp.prototype[@@replace]()

更新日:2024/06/14

RegExp.prototype[@@replace]()は、RegExpオブジェクト(RegExpコンストラクターのインスタンス)プロトタイプチェーンに組み込まれるメソッドです。

@@replaceは仕様上の表記です。
プログラムコード上では、Symbol.replace に置き換えられます。

RegExp.prototype[Symbol.replace]()は、引数を二つ受け取ります。
一つ目の引数に対してマッチング処理を行い、一致した文字列を二つ目の引数に内容に従って置き換えます。

gフラグが指定されている場合は、全てのマッチ文字列を置換します。
指定されていない場合は、最初の一回のみを置換します。

 

■構文

RegExp.prototype [ @@replace ] ( string, replaceValue )
  1. string: 解析対象の文字列
  2. replaceValue: 置換文字列または関数

    置換文字列についてはこちらを参照
    関数についてはこちらを参照

置換後の文字列

 

■置換文字列について

検索する値が文字列またはRegExpオブジェクトのとき、置換文字列は次の意味がある文字列パターンを含むことができます。

文字列パターン意味
$&一致した文字列"abcabc".replace("b","$&$&$&")
→ "abbbcabc"
"abcabc".replace(/b/g,"$&$&$&")
→ "abbbcabbbc"
$`
(バック
クオート)
一致した文字列の
前方文字列
"abcabc".replace( "b" , "$`")
→ "aacaabcac"
"abcabc".replace( /b/g , "$`")
→ "aacaabcac"
$'
(シングル
コーテーション)
一致した文字列の
前方文字列
"abcabc".replace( "b" , "$'")
→ "acabccabc"
"abcabc".replace( /b/g , "$'")
→ "acabccacc"
$$"$"に置き換え"abcabc".replace( "b" , "$$")
→ "a$cabc"
"abcabc".replace( /b/g , "$$")
→ "a$ca$c"
$n
(nは数値)
n番目の
キャプチャ文字
"abcabc".replace( /(a)(b)(c)/g , "$3$2$1")
→ "cbacba"
$<Name>
(Nameはグループ名)
Nameに対応する
キャプチャ文字
"abcabc".replace(
/(?<n1>a)(?<n2>b)(?<n3>c)/g
, "$<n3>$<n2>$<n1>")
→ "cbacba"

 

■replaceValue関数について

引数replaceValueが関数の場合、検索対象の文字列を受け取り置き換え後の文字列を返します。

replaceValue( text , p1 , p2 , ... pn , index , alltext ,group )
  1. text: 一致した文字列
  2. index: 一致した位置
  3. p1 , p2 , ... pn : キャプチャグループ
  4. alltext: 置換対象の文字列全体
  5. group: グループ名をプロパティ名にキャプチャ値をプロパティ値に持つオブジェクト

 

■使用例

▶文字列に置き換え

const rg1 = /(\d)(\d)/g;
const rg2 = /(\d)(\d)/;

const t = "a12b34cd";

console.log( rg1[Symbol.replace]( t ,"XX") ); // aXXbXXcd
console.log( rg2[Symbol.replace]( t ,"XX") ); // aXXb34cd

▶置換パターンを含む文字列に置き換え

const rg1 = /(\d)(\d)/g;
const rg2 = /(\d)(\d)/;

const t = "a12b34cd";

console.log( rg1[Symbol.replace]( t ,"[$`]") ); // a[a]b[a12b]cd
console.log( rg2[Symbol.replace]( t ,"[$`]") ); // a[a]b34cd

▶関数による置き換え

const rg1 = /(\d)(\d)/g;
const rg2 = /(\d)(\d)/;

const t = "a12b34cd";
const replaceFUnc = (...m)=>
         (Number(m[1]) + 1).toString()
            + (Number(m[2]) + 1).toString();
    

console.log( rg1[Symbol.replace]( t ,replaceFUnc) );  // a23b45cd
console.log( rg2[Symbol.replace]( t ,replaceFUnc) );  // a23b34cd

 

■備考

String.prototype.replace()およびString.prototype.replaceAll()の引数にRegExpオブジェクトを指定したとき、各メソッドはRegExp.prototype[@@replace]()を呼び出し、その結果をそのまま返します。

更新日:2024/06/14

書いた人(管理人):けーちゃん

スポンサーリンク

記事の内容について

null

こんにちはけーちゃんです。
説明するのって難しいですね。

「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。

裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。

掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。

ご意見、ご指摘はこちら。
https://jsref.affi-sapo-sv.com/info.php

 

このサイトは、リンクフリーです。大歓迎です。