【JavaScript】パターンマッチ比較 match、search、test、exec
2007.04.25 Author: たわばがに
ということで、今回はJavaScriptのパターンマッチネタです。
比較するメソッドとしてmatch、search、test、exec、の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システム開発・ネットワーク構築会社 コネクティボへ