JavaScript, Neo-Generation
Written 1/5/00
9. 正規表現(2)
Regular Expression オブジェクト JavaScript 1.2 JScript 3
前回次のように正規表現を使いましたが、
  alert(/bc/.test("abc"));
 
/bc/ の部分が Regular Expression オブジェクトになります。 正規表現がスクリプトを書く段階で決まっていれば上のようになりますが、 決まっていない場合は次のように Regular Expression オブジェクトを生成します。
  function test1(form) {
    //Regular Expressionオブジェクトを生成
    var rgexp = new RegExp(form.text1.value);
    alert(rgexp.test("abc"));
  }
 
テキストボックスに bc と入力してボタンを押してください。 すると、入力した文字列が正規表現のパターンとする Regular Expression オブジェクトが生成され、検索が行われます。 今回の場合 true が返ってきます。
スイッチ JavaScript 1.2 JScript 3
Regular Expression オブジェクトに次のように i スイッチを入れると、 大文字・小文字の区別なく検索を行います。
  alert(/bc/i.test("ABC"));          //true
 
Regular Expression オブジェクトを動的に生成する場合は、 次のように引数を取ってスイッチを入れます。
  var str = "bc";
  var rgexp = new RegExp(str, "i");
  alert(rgexp.test("ABC"));          //true
 
その他に、パターンに一致する文字列すべてを検索する g スイッチもあります。 これは、String オブジェクトの replace メソッドや match メソッドで用います。
  var str = "aba";
  alert(str.replace(/a/g, "c"));     //cbc
  alert(str.match(/a/g));            //a,a
 
i と g を同時に使いたい場合は、gi とします。
  var str = "aba";
  alert(str.replace(/A/gi, "c"));     //cbc
 
詳しくは、 String(2) をご覧ください。
complie メソッド JavaScript 1.2 JScript 3
正規表現は実行速度を上げるために、 いったん内部形式に変換されてから検索が行われます。
動的に Regular Expression オブジェクトが生成される場合は、 検索が行われる前にその都度内部形式への変換がなされます。 しかし、complie メソッドをいったん実行しておけば、 内部形式への変換はこの時だけで、 あと検索される前に変換されることはなくなります。
  //動的バージョン
  var t0 = new Date();                  //開始の時刻
  var str = "ほえほえハッピー";
  var rgexp = new RegExp("ハッピー");
  for(var i = 0; i < 100000; i++)       //10万回
    rgexp.test(str);
  var t1 = new Date();                  //終了の時刻
  alert((t1 - t0) / 1000 + " s");       //かかった秒数
 
  //静的バージョン
  var t0 = new Date();
  var str = "ほえほえハッピー";
  var rgexp = /ハッピー/;
  for(var i = 0; i < 100000; i++)
    rgexp.test(str);
  var t1 = new Date();
  alert((t1 - t0) / 1000 + " s");
 
  //あらかじめコンパイルした場合
  var t0 = new Date();
  var str = "ほえほえハッピー";
  var rgexp = new RegExp("ハッピー");
  rgexp.compile();
  for(var i = 0; i < 100000; i++)
    rgexp.test(str);
  var t1 = new Date();
  alert((t1 - t0) / 1000 + " s");
 
どうでしょうか? うちでは一番下がちょっと速いのですが。
Back