Logo address

Javascript: Replace の怪

2007/10/09

Javascript は文字列を正規表現(注1)に基づいて置き換えるメソッドとして replace を持っている。そしてこのシンタックスとして

文字列.replace(パターン,文字列)
がサポートされている。パターンとして、引用符で囲むタイプとスラッシュを使うものが許されている。マニュアル(注2)には共に正規表現として説明されているが実体は違うようだ。

注1: Javascript の正規表現に関しては次の URL が良く解説されている。
注2: 例えば

Mozilla 系でしか確認していないが、引用符で囲った場合には、実際には文字列の単純な置換でしかない。この場合には実は(隠し?)オプションがあって、第三引数に "g" を指定すると、文字列に現れる全てのパターンが置換される。

正規表現を使う場合にはスラッシュを使わなくてはならない。正規表現にスラッシュを使う記法は UNIX のテキストエディタ ed が起源だと思う(注1)。そして sed や awk, さらには perl や javascript にまでこの記法が引き継がれている。正規表現は単なる文字列ではなく、正規表現オブジェクトの特別なクラスに属しているのである。

注1: Wikipedia によると QED が最初に正規表現を導入したという。僕は QED を使っていた経験があるが、スラッシュを使っていたか否かは覚えていない。しかし今回改めて調べてみると ed のシンタックスそのものらしい。

パターンを動的に構成するにはどうするか? 例えばテキストエリアからパターンを読み取る場合である。Javascript には RegExp がこのような目的のために準備されている。

  u = document.getElementById("text").value;
  u = new RegExp(u);
  t = s.replace(u,"b");
この例では簡単のためにマッチした文字列を "b" に置き換えるようになっているが、目的に合わせて書き換えればよい。

以下の Javascript はここに述べた事の確認用である。

function example(){
  var s,t,u;
  t = '';
  s="abab";
  t += s.replace("a","b") +"\n";
  t += s.replace("a","b","g") +"\n";
  t += s.replace("^a","b") +"\n";
  t += s.replace("[a]","b") +"\n";
  t += "\n";
  t += s.replace(/a/,"b") +"\n";
  t += s.replace(/a/g,"b") +"\n";
  t += s.replace(/^a/g,"b") +"\n";
  t += s.replace(/^[a]/,"b") +"\n";
  t += "\n";
  u="^a";  t += s.replace(u,"b") +"\n";
  u=/^a/;  t += s.replace(u,"b") +"\n";
  u=document.getElementById("text").value;
  u=new RegExp(u);
  t += s.replace(u,"b") +"\n";
  alert(t);
}
この関数が呼び出されます。