【JavaScript】パターンマッチ比較 match、search、test、exec

2007.04.25 Author: たわばがに

ということで、今回はJavaScriptのパターンマッチネタです。

比較するメソッドとしてmatchsearchtestexec、の4つを取り上げます。
それぞれ性質が異なるので、使う場合は注意が必要です。

比較のために、以下のようなサンプルを作ってみました。

<script type="text/javascript">
<!--
// match()の場合
function hoge1() {
    base_str = "オッス。おら Tawabagani。"
             + "友人の Abeshiganiと間違えないでくれよな。";
    match_pattern = /\w+?gani/g;
    r = base_str.match(match_pattern);
    if (r) {
        for(var i=0; i<r.length; i++) {
            alert(r[i]);
        }
    } else {
        alert("該当なし");
    }
}
// search()の場合
function hoge2() {
    base_str = "オッス。おら Tawabagani。"
             + "友人の Abeshiganiと間違えないでくれよな。";
    match_pattern = /\w+?gani/g;
    r = base_str.search(match_pattern);
    alert(r);
}
// test()の場合
function hoge3() {
    base_str = "オッス。おら Tawabagani。"
             + "友人の Abeshiganiと間違えないでくれよな。";
    match_pattern = /\w+?gani/g;
    r = match_pattern.test(base_str);
    alert(r);
    r = match_pattern.test(base_str);
    alert(r);
    r = match_pattern.test(base_str);
    alert(r);
}
// exec()の場合
function hoge4() {
    base_str = "オッス。おら Tawabagani。"
             + "友人の Abeshiganiと間違えないでくれよな。";
    match_pattern = /\w+?gani/g;
    r = match_pattern.exec(base_str);
    alert(r);
    // 何文字目?(最後に見つかった文字列の直後の位置)
    alert(r.lastIndex);
    r = match_pattern.exec(base_str);
    alert(r);
    // 何文字目?(最後に見つかった文字列の直後の位置)
    alert(r.lastIndex);
    r = match_pattern.exec(base_str);
    if (r) {
        alert(r);
        // 何文字目?(最後に見つかった文字列の直後の位置)
        alert(r.lastIndex);
    } else {
        alert("該当なし");
    }
}
//-->
</script>

まず、hoge1()を実行した場合、結果は以下の通り。

Tawabagani をalert表示。
Abeshigani をalert表示。

matchメソッドを使う場合、マッチパターンが配列に格納されて返されます。
今回の場合は、TawabaganiとAbeshiganiがマッチパターンとして配列rに格納されます。

次に、hoge2()を実行した場合、結果は以下の通り。

7 をalert表示。

searchメソッドを使う場合、マッチパターンの先頭位置(先頭は0)が返されます。
今回の場合は、「オッス。おら 」の次の「T」が該当箇所となるので、7となります。

続いて、hoge3()を実行した場合、結果は以下の通り。

true をalert表示。
true をalert表示。
false をalert表示。

testメソッドを使う場合、マッチパターンがある場合はtrueが、ない場合はfalseが返されます。
今回の場合、同メソッドを3回実行していますが、3回目にfalseを返しています。
これはオブジェクトの持つlastIndexプロパティを参照し、
文字列の途中からパターンマッチングを行っているためです。
lastIndexプロパティに関しては、最後のexecメソッドにて。

最後に、hoge4()を実行した場合、結果は以下の通り。

Tawabagani をalert表示。
17 をalert表示。
Abeshigani をalert表示。
32 をalert表示。
該当なし。 をalert表示。

execメソッドを使う場合、matchメソッドと異なり、マッチパターンの1つが返されます。
今回の場合はlastIndexプロパティもalertで表示させています。
このlastIndexプロパティで取れているのは、マッチパターンの最後の文字位置+1(先頭は0)です。
「オッス。おら Tawabagani」の次の「。」が該当箇所となるので、17となります。
lastIndexプロパティを保持した状態でパターンマッチを行うと、
そのプロパティで持つ文字位置からパターンマッチを開始します。

サンプルでは、パターンマッチを3回繰り返しているため、
最初のマッチパターンとなる「Tawabagani」、
その最後の文字位置+1で「17」、
18文字目以降のマッチパターンとなる「Abeshigani」、
その最後の文字位置+1で「32」、
最後にマッチパターンなしで「該当なし」、
という結果になっているわけです。

以上から、マッチパターンを全て抜き出したい場合はmatch
繰り返し操作で順々にマッチパターンが欲しい場合はexec
exec同様の捜査でマッチパターンがあるかどうかだけを知りたい場合はtest
単純に先頭のマッチパターンだけが欲しい場合はsearch(パターンにgを付けないmatchでも可)、

と使い分けるとよいでしょう。
今のところ、matchを使う機会が多いような気はします。

以上、パターンマッチネタでした。

名古屋のWebシステム開発・ネットワーク構築会社 コネクティボへ