やりたかったこと
// ho--$&--ge を出力したい
'hogehoge'.replace(/geho/, '--$&--');
// result
// ho--geho--ge
$&
は $1
等と同様に登録済みパターンであり、マッチした部分全体を出力する機能があります
そのため、このスクリプトを実行すると ho--$&--ge
ではなく、ho--geho--ge
と出力されてしまします
これを回避する方法を探したので、備忘録として記しておきます
方法1: $$を使う
// ho--$&--ge を出力したい
'hogehoge'.replace(/geho/, '--$$&--');
// result
// ho--$&--ge
置換結果文字列を直接変更できる状況であれば単純に $$
を使うことでエスケープすることができます
方法2: コールバックを使う
// ho--$&--ge を出力したい
'hogehoge'.replace(/geho/, () => '--$&--');
// result
// ho--$&--ge
今回は置換結果文字列生成部分を外部モジュールで行なっていたため、こちらの方法で回避しました
コールバックの引数を無視した関数を引数として与えることで、全ての特殊文字を考慮しないで単純な文字列として置換することができます
おまけ
記号 | 効果 |
---|---|
$$ | $を挿入します。 |
$& | マッチした部分文字列を挿入します。 |
$` | マッチした部分文字列の直前の文字列の部分を挿入します。 |
$' | マッチした部分文字列の直後の文字列の部分を挿入します。 |
$n | n は 100以下の正の整数が入ります。第一引数が RegExp オブジェクトだった場合、n 番目の括弧でキャプチャされたサブマッチの文字列を挿入します。これは 1-でインデックスされるのにご注意ください。 |