正規表現ではエスケープが必要な文字があります。通常は事前にエスケープしておくわけですが、下のような場合には随時のエスケープが必要になります。
function fn(src, keyword) {
let rx = new RegExp(`foo${keyword}baa`, "g")
return src.replace(rx, "hoge")
}
エスケープする関数が必要になる前に準備してストックしておけば安心ですね。僕は下のように書いています。
function esc(r) {
if (typeof r === "string" || r instanceof String) return p(r)
else if (Array.isArray(r)) return r.map(r => r = p(r))
else return r
function p(r) {
return r.replace(/(/|\|^|$|*|+|?|.|(|)|[|]|{|})/g, "\$1")
}
}
文字列が入力されればエスケープした文字列で返し、配列が入力されればエスケープした配列で返します。その他はそのまま返します。
冒頭の例に適用すると下のようになります。
function fn(src, keyword) {
let rx = new RegExp(`foo${esc(keyword)}baa`, "g") // <= ここ
return src.replace(rx, "hoge")
}
この関数は GitHub で公開しています。コードの中にはアンエスケープする関数が含まれているのですが、必要になることがあるのか不明です。一応作りました。使ったことないけど。