JavaScriptで文字列を正規表現でマッチさせるメソッドはいくつかあります。
代表的なのはmatchメソッドで正規表現内のカッコを含めたマッチが可能です。
しかし実はそれ以外にも正規表現が使えるマッチ系のメソッドはあります。
という訳でそれらのメソッドの使い方についてコード例と一緒に解説
このページの目次
マッチ系メソッドまとめ
そのメソッドというのが次の2つ
- String.prototype.match
- RegExp.prototype.exec
Stringオブジェクトのmathcメソッドはよく使われるし有名ですよね。
ですが実は正規表現オブジェクトでもexecメソッドを使えばマッチ処理ができます。
これら2つのメソッドの詳しい使い方は次の通り
String.prototype.matchメソッド
これは文字列に対してある正規表現のマッチング結果を受け取るためのメソッド
次のように文字列 str に対して正規表現オブジェクト regexp を渡して使います。
1 |
str.match(regexp); |
そして文字列がマッチした場合、マッチング結果の配列を返してきます。
配列の中身は最初に一致した全体の文字列、その後にカッコで補足された内容が続くような感じ
ちなみにマッチが見つからなかった場合は null が返されるようです。
具体的な使い方ですが、例えば次が簡単なコード例
1 2 3 4 5 6 |
var str = 'blueberry'; var regexp = /\w+berry/; var matched = str.match(regexp); console.log(matched[0]); /// => blueberry |
'blueberry' という文字列に /\w+berry/ の正規表現をマッチさせ、マッチした文字列全体 matched[0] をコンソールに表示しているコードです。
これが超基本的な使い方
それに加え、matchではカッコで補足することでマッチング結果全てを受け取れます。
カッコで補足したマッチ結果を受け取るには
もし文字列の個別の部分だけマッチさせたい場合、
正規表現でカッコ () を使えばその部分だけ抜き取ることができます。
例えば次がカッコを使った正規表現マッチングの例
1 2 3 4 5 6 |
var str = 'blueberry'; var regexp = /(blue|black)berry/; var matched = str.match(regexp); console.log(matched[1]); /// => blue |
コード中の正規表現 regexp は 'blueberry' または 'blackberry' にマッチします。
そして返される配列のインデックス1番目以降にカッコで補足した内容が入ります。
上の例だとカッコは単独ですが入れ子にすることも可能です。
例えば次は正規表現のカッコが入れ子になっているコード例
1 2 3 4 5 6 7 8 |
var str = 'blueberry pie'; var regexp = /((blue|rasp)berry) pie/; var matched = str.match(regexp); console.log(matched[1]); /// => blueberry console.log(matched[2]); /// => blue |
上のコードでマッチング結果を表す配列 matched の
インデックス1番目には
((blue|rasp)berry) のマッチ結果、
インデックス2番目には
(blue|rasp) のマッチ結果
が入って返されます。
こういう風に入れ子になっていた場合は外側から内側の順番で結果が返されます。
またさらに複雑な場合は入れ子を並列にした上で入れ子にする場合もあり
例えば次は /((blue|rasp)berry) (pie|cake)/ という正規表現を使ってマッチしているコード例
1 2 3 4 5 6 7 8 9 10 |
var str = 'blueberry cake'; var regexp = /((blue|rasp)berry) (pie|cake)/; var matched = str.match(regexp); console.log(matched[1]); /// => blueberry console.log(matched[2]); /// => blue console.log(matched[3]); /// => cake |
上のコードを見ればわかるようにカッコで補足された内容は
- 並列だった場合は左から右の順番
- 入れ子なら外側から内側の順番
という風に解析されてマッチング結果に入ります。
以上がmatchを使ったマッチングのやり方
カッコで補足された内容まで受け取れるのでコードをスマートに書くのに便利です。
RegExp.prototype .exec
これは正規表現オブジェクトから文字列に対してマッチを実行するメソッド
例えば正規表現オブジェクト regexp に対して文字列 str を渡して使います。
1 |
regexp.exec(str); |
ちょうどさっきのmatchメソッドの逆バージョンみたいな感じですね。
そしてこのメソッドもそれと同じようにマッチ結果の配列を返してきます。
またマッチするものがない場合は null が返ってくる模様
使い方ですが、例えば次は文字列全体をマッチさせているコード例
1 2 3 4 5 |
var str = 'blueberry'; var regexp = /\w+berry/; var matched = regexp.exec(str); console.log(matched[0]); |
execメソッドでも返される配列の最初にマッチ文字列全体が入っています。
そして次がカッコで補足した内容を受け取っているコード例
1 2 3 4 5 6 7 8 9 10 |
var str = 'blueberry cake'; var regexp = /((blue|rasp)berry) (pie|cake)/; var matched = regexp.exec(str);; console.log(matched[1]); /// => blueberry console.log(matched[2]); /// => blue console.log(matched[3]); /// => cake |
カッコが結果配列に入る順番は match と全く同じです。
以上がexecメソッドの使い方
個人的には「これはどこで使うんだろう?」と思ってますが、多分用途によっては使う必要のある場面とかが出てくるんだと思います。
もし正規表現のテストだけをしたい場合は
今までで紹介したのは正規表現のマッチを行うメソッドです。
しかし詳しいマッチ結果が必要ない次のような場面もあるはずです。
- マッチするかどうかだけ知りたい
- 一番最初にマッチしたインデックスだけ知りたい
その場合は次のようなメソッドを使うのがおススメ
- String.prototype.search
- RegExp.prototype.test
これらは単純に文字列が正規表現にマッチするかどうかだけに使えます。
詳しい使い方については次で書いたのでそちらをチェック
記事の最後で match と exec との実行速度の違いも測ってみましたが、無駄な処理がない分だけ search や test の方が速いようです。
正規表現の関連記事
正規表現については次の記事でも色々紹介・解説してます。
JavaScriptで正規表現を表す2つの方法とパフォーマンス的な違い
正規表現の内部処理が分かる便利ツールregex101を使ってみた
ここまでのまとめ
ということでマッチ系のメソッドを簡単にまとめ
- String.prototype.match
文字列 str に対して正規表現オブジェクト regexp を渡して使う
- RegExp.prototype.exec
正規表現オブジェクト regex に対して文字列 str を渡して使う
個人的には match でも exec でもどちらを使っても問題ないと思います。
もしかしたら何か違いがあるかもしれないので、機能的にはほとんど同じですね。
以上JavaScriptで使えるマッチ系のメソッドについてでした。
ではでは($・・)/~~~