新JavaScript入門 36
正規表現

ここではRegular Expressionオブジェクトを使った 正規表現による検索について説明します。
正規表現による検索の基本
とりあえずマッチするかどうかを調べる場合、次のようにします。
    /pattern/[switch].test(string)
以下、例です。
    alert(/ab/.test("bab"));            //true
    alert(/ab/.test("bca"));            //false
    alert(/[2-4]/.test("573"));         //true
    alert(/ab/i.test("BAB"));           //true

上のコードの最初の行は、文字列"bab"がabというパターンにマッチするかどうかを 調べています。マッチするとtureを返します。
次の行はマッチしないのでfalseを返します。
3行目は、2から4の数字(すなわち、"2"、"3"、"4"のうちのいずれか) にマッチするか調べています。
最後の行はスイッチ i をつけています。 これをつけると、大文字・小文字を区別せずに検索します。

コーディング時にパターンがわかっている場合には上のようにしますが、 スクリプトの実行時にパターンを決定する場合には 検索の前にRegular Expressionオブジェクトを作ります。

function test2(form) {
    var str = "abcbda";             //検索される文字列
    //Regular Expressionオブジェクト
    var rexp = new RegExp(form.text1.value);
    alert(rexp.test(str));          //マッチするかどうか
}
上のテキストボックスにパターンを入力してください。 文字列 "abcbda" にマッチするかどうかが表示されます。

Regular Expressionオブジェクトは次のように作成します。

    var regularexpression = new RegExp(pattern,[switch])
こうして得られたRegular Expressionオブジェクトに対し、 testメソッドを働かせてマッチングを行います。
compileメソッド
上のように実行時にパターンが決定される場合、 検索を高速化するためのパターンの内部形式への変換は実行時、 検索実行の直前に行われます。 同じパターンで繰り返し検索を行う場合は、 この変換を繰り返さないために、一度 compile メソッドで変換を行っておきます。 こうすれば、検索実行時に内部形式への変換は行われず、実行の高速化が図られます。
var objRegExp, stream, iline;
objRegExp = new RegExp();
objRegExp.compile(pattern);         //内部形式に変換
stream = objfile.OpenAsTextStream();    //入力ストリーム
//ファイルの終端まで読む
for(iline = 1; !stream.AtEndOfStream; iline++) {
    str = stream.ReadLine();    //1行読む
    if(objRegExp.test(str))     //マッチすれば出力する
        WScript.Echo(fileobj.Path+"("+iline+"): "+str);
}
stream.Close();                 //ファイルを閉じる
あるファイルを読みこんであるパターンにマッチする行を出力します。 上の例は
Windows Scripting Host です。

以上のようにtestメソッドを用いますが、 indexOf メソッドのようにマッチした場所を知るには、 searchメソッドを使ってください。

execメソッド
検索の結果を詳しく得るにはexecメソッドを使います。
    var a = /(ab).+(ab)/.exec("abcabc");
    for(var i = 0; i < a.length; i++)
        alert(a[i]);

execメソッドはマッチした文字列の配列を返します。 具体的には、最初の配列の要素がマッチした全体、 次の要素からが()の中にマッチした部分が左から順になるようです。

execメソッドを実行すると、 詳しい結果がRegExpオブジェクトに反映されます。

    if(/(\d+):(\d+):(\d+)/.exec("18:02:00"))
        alert(RegExp.$1 + "時" + RegExp.$2
                        + "分" + RegExp.$3 + "秒");

\dは数字0〜9のいずれかとマッチする、 すなわち[0-9]と同じです。 \d+で一つ以上の数字の並びということになります。
()がついているのは、そこにマッチするとメモリに格納されるということです。 具体的には左から順に、RegExpオブジェクトの $1プロパティ、 $2プロパティ、 $3プロパティに格納されます。


first, back, next, exit
Written 9/17/98