javascriptにおける正規表現テクニックのまとめ

正規表現による置換において変数を利用する方法

例えば以下のような文字列の最後についている余計な区切り文字「,」を除去する正規表現を考える場合、どのサイトを見ても以下のようにやる方法は載っている。

'1,2,3,4,5,'.replace(/,$/, '');

しかし、区切り文字が時と場合によって異なる場合、例えば変数delimiterに格納されて渡ってきた場合、これを利用してパターンを組む場合、以下のようにしてはだめ。「/」で囲まれるのはパターンなので、「pattern」は変数として扱われるのではなく、「pattern」という正規表現パターンとして扱われる。

var delimiter = ',';
var pattern = delimiter + '$';
'1,2,3,4,5,'.replace(/pattern/, '');

ではどうすればよいのか。replaceメソッドの第一引数は正規表現オブジェクトを取ることもできるので、それを利用する。

var delimiter = ',';
'1,2,3,4,5,'.replace(new RegExp(delimiter + '$'), '');

オプションを伴う場合

区切り文字「,」を空白ですべて置き換えたい場合、以下のようにgオプションを追加することで、いわゆるreplaceAllを実現するのだが、

'1,2,3,4,5'.replace(/,/g, ' ');

これをRegExpを使って書く場合は次のようにする。

var delimiter = ',';
'1,2,3,4,5'.replace(new RegExp(delimiter, 'g'), ' ');

パターンマッチングした部分の抽出

例えば「2008年4月22日」を「2008/4/22」とするにはどうすればいいだろうか。以下のように正規表現パターンにおいて「()」で囲むことでマッチング部分を$変数で利用できる。

'2008年4月22日'.replace(/(\d{4})年(\d{1,2})月(\d{1,2})日/, '$1/$2/$3');

では、「the jacket and the bag are mine.」という文章を「the JACKET and the BAG are mine.」という文章に変更する場合はどうだろうか。同じように抽出する方法で考えると次のようになる。

'the jacket and the bag are mine.'.replace(/the\s(\w+)\s/g, 'the $1.toUpperCase() ');

しかしこれはうまくいかない。$1に対してtoUpperCaseメソッドは適用されず、「the jacket.toUpperCase() and the bag.toUpperCase() are mine.」とそのまま表示されてしまう。ではどうするのか。

replaceメソッドの第二引数は関数も渡せる

replaceメソッドの第二引数に関数が渡せるので、それを利用する。

var upper = function(a, b) {
  return 'the ' + b.toUpperCase() + ' ';
}

'the jacket and the bag are mine.'.replace(/the\s(\w+)\s/g, upper);

ちなみに第一引数aはパターンマッチングした「the jacket 」で、第二引数bはさらに「()」で抽出された「jacket」となる。


これだけ知っていれば正規表現を使っていろいろ出来ると思う。