JavaScript の正規表現についてまとめてみた
JavaScript において、文字列を正規表現にマッチさせるためのメソッドは、以下の4つがあります。
1. RegExp.test()
2. RegExp.exec()
3. String.match()
4. String.search()
RegExpオブジェクトのメソッド(引数がStringオブジェクト)と、Stringオブジェクトのメソッド(引数がRegExpオブジェクト)があり、しかもすべてのメソッドで微妙に動作が違うので、非常に紛らわしい… ということで、これらがどう違うのか、どう使い分ければいいかをまとめてみました。
## RegExp.test() とString.search()
まずはパターンにマッチするかどうかだけをチェックしたい時。
あるパターンが文字列に存在するかどうかだけを知りたいときは、RegExp.test() または String.search() を使います。
* **RegExp.test():** 文字列が正規表現にマッチしたらtrueを返し、そうでなければfalseを返す。
* **String.search():** 文字列が正規表現にマッチしたら、マッチした場所のインデックスを返す。マッチしなければ-1を返す。
単にマッチするかどうかだけをチェックしたい時には、これらのメソッドを使うべき(RegExp.exec()やString.match()より速い)。そしてこの場合、true/false を返してくれる RegExp.test() の方が使いやすいのかなという気がします。
## RegExp.exec()
マッチが成功した場合、RegExp.exec() は配列を返し、マッチが失敗した場合は null を返します。
そして、RegExp.exec() が配列を返す時、その配列には、[0]にマッチした文字列が、[1]…[n]にn番目の括弧で取り出された部分文字列が格納されています。
正規表現で”g”フラグを使う場合、マッチする文字列をすべて取り出すためには、RegExp.exec() を複数回使う必要があります。
例:
var re = /d(b+)d/g;
var str = “cdbbdbsbzcdbbbbbd”;
var arr;
while ((arr = re.exec(str)) !== null) {
console.log(arr);
}
⇒ [“dbbd”, “bb”]
[“dbbbbbd”, “bbbbb”]
## String.match()
正規表現が”g”フラグを含んでいない場合は RegExp.exec() と同じ結果を返します。つまり、マッチが成功した時には配列が返され、その配列には、[0]にマッチした文字列が、[1]…[n]にn番目の括弧で取り出された部分文字列が格納されています。そして、マッチに失敗した場合は null が返ります。
正規表現が”g”フラグを含んでいる場合、マッチしたものすべてを含む配列を返します。この時、()でマッチさせた部分文字列を取り出すことは出来なくなります。”g”フラグと()による部分文字列の取り出しを同時に使う必要がある場合は、RegExp.exec() の方を使います。
## まとめると
* 文字列が正規表現にマッチするかどうかだけをテストしたい時
→ RegExp.test() を使う
* () を使って部分文字列を取り出したい時
→ RegExp.exec() を使う
* 正規表現の”g”フラグは使うが、()を使って部分文字列を取り出す必要がない場合
→ String.match() を使う
* 文字列中の正規表現にマッチする場所を調べたい時(あまりこういうケースはない気がする…)
→ String.search() を使う
こうしてまとめてみると、「基本、RegExp オブジェクトのメソッドを使え」という話になった気がする(^_^;