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 オブジェクトのメソッドを使え」という話になった気がする(^_^;

スポンサーリンク
スポンサーリンク:

フォローする