Panda Noir

JavaScript の限界を究めるブログです。

JavaScriptの正規表現に変数を組み込む方法

正規表現の中に変数を組み込むことにあれこれと悩んでる人はお読みください。

RegExpオブジェクト

RegExpというオブジェクトをご存知でしょうか? RegExpとは、正規表現オブジェクトを生成するコンストラクタで、パターンマッチングを行う際に使います。

正規表現オブジェクトは new RegExp(パターン, 修飾子) で生成できます。なんのことだかわからないですね。 new RegExp(パターン, 修飾子)は /パターン/修飾子 という正規表現リテラルと等価です。こっちはよくみるのではないでしょうか? a = a.replace(/\n/g, "")の、 /\n/g です。

正規表現オブジェクトと正規表現リテラルで生成されるものは等価、とさきほどいいました。しかし、2つで使い方が決定的に違う点がひとつあります。それは正規表現リテラルには変数を組み込めませんが、RegExpは変数を組み込めるという点です。

RegExpの場合パターンに渡すのは文字列です。それに対し、正規表現リテラルリテラルなので変数を組み込む部分がありません。

(もちろん正規表現リテラルには正規表現リテラルでメリットが有ります。まず、文字列を渡すわけでないので2重エスケープするといったややこしいことをする必要が一切ありません。そして、見やすいです。正規表現リテラルなら正規表現だと一発でわかりますし、エディタでも大抵の場合正規表現リテラル用にシンタックスで色分けしてくれます)

実際に正規表現に変数を組み込む場面はこんなかんじです。

for (var i = 0; i < word.length; i++) {
    var reg = new RegExp(word[i] + '\n', 'g');
    result = result.replace(reg, '');
}

これで word[i] + '\n' にマッチしたものを result から削除できます(実際に使う場合は.indexOf()を用いて削除対象が見つかった場合のみRegExpでオブジェクトを生成するようにします。.indexOf()の方が.replace()処理よりもはるかに軽いので余計な.replace() 処理をさけるためです。やらないとパフォーマンスが恐ろしいことになります)。

終わりに

意外と知られていない(というか使っている人を見ない) RegExp です。知っているとそのうち役立つと思います。