変数を使う時はnew RegExp、そこで()使って$1とかで置換したい時はRegExp.$1か引用符で囲む

正規表現に変数を使いたくて、前に覚えたJavaScriptの正規表現で変数? - おふぃす・ぞんち開発日記みたいに

re = new RegExp("^" + vname + "[0-9]+$");

ってやってたのだけど、置換文字列に$1を使うときのやり方でハマった。

var keyword = 'text';
var reg = new RegExp('(' + keyword + ')', 'gi');
var pre = 'pre';
var post = 'post';
'text-text-text'.replace(reg, pre + $1 + post);

でエラー。

なんでだ?なんでだ?と散々考えた結果、

var keyword = 'text';
var reg = new RegExp('(' + keyword + ')', 'gi');
var pre = 'pre';
var post = 'post';
'text-text-text'.replace(reg, pre + "$1" + post); // $1->"$1"に変更。

で解決した。

$1が、さも変数だと思い込んでしまってたがために引用符つけることを考えなかった。
引用符付けずに変数としてやるためにはRegExp.$1にするのね。

'text-text-text'.replace(reg, pre + RegExp.$1 + post);