【JavaScript】正規表現オプションの意味と使い方まとめ

JavaScriptの正規表現はいくつか表し方があります。

それは次のように正規表現リテラルを使う方法とRegExpオブジェクトを使う2通り

この2つの使い方やパフォーマンス的な違いは次でもまとめました。

 

それでこれら正規表現にはオプションフラグ)を付けることもできます。

例えばリテラルの場合は最後のスラッシュ( /  )の後、RegExpの場合は第2引数にオプションを文字列として渡すことが可能

最後についている g  とか m  とかの文字がオプション

全てのオプションはこのように1文字で表され、

  • グローバルサーチ
  • 小文字・大文字の区別
  • 複数行検索

などの高度な検索をするために使われます。

 

そこでここではJavaScriptの正規表現内で使えるオプションについてまとめてみました。

時々忘れがちになるので自分の記憶の整理も兼ねて紹介します。

正規表現に使える4つのオプション(フラグ)

JSの正規表現で利用可能なオプションは次の4つ

  • gオプション
  • iオプション
  • mオプション
  • uオプション

gオプション

これはグローバルサーチをするために使われるオプション

つまり文字列全体で見つかった全てのパターンにマッチさせるという意味です。

 

ではまずgオプションを使わないとどうなるか考えてみます。

例えば次は文字列 text  に対してreplaceメソッドを使って 'hoge'  を 'piyo' に置換しているコード

この場合、gオプションはついてないので最初の 'hoge'  だけ置換されます。

つま置換後のテキストは 'piyo hoge hoge'  のようになるということ

gオプションを付けないと、このように一度しか検索・置換されません。

 

一方で次はgオプションを付けた場合のコード

見てわかるように /hoge/  から /hoge/g  と変更してあります。

こうすればパターンが繰り返し置換されるので、置換後テキストは 'piyo piyo piyo'  となります。

 

以上がgオプションの意味と使い方

あるパターンを繰り返し置換したり検索したい場合は必須のオプションです。

iオプション

これ小文字と大文字を区別しないで検索・置換するためのオプション

例えばマッチさせるときに小文字の「a」と大文字の「A」は同じと扱われます。

 

こちらもiオプションを使わない場合から考えてみましょう。

例えば次は文字列 text  内にある 'hoge'  を 'PIYO'  に置換しようとしてるコード例

当然小文字だけの 'hoge'  しか 'PIYO'  に置換されません。

なので置換後のテキストは 'HOGE HOge PIYO'  となります。

 

一方で次はiオプションを付けた場合のコード

/hoge/ig  のようにgオプションの前にiオプションを付けました。

そうすると置換後のテキストは 'PIYO PIYO PIYO'  となります。

このように小文字・大文字関係なしで検索・置換できるのがiオプションのメリットです。

mオプション

これは対象のテキストを複数行として扱うためのオプション

逆に言えばmオプションがないと、どんなテキストでも1行として扱われるという意味です。

 

これがどんな場面で役立つかというと各行の最初と末尾にマッチさせたい場合

例えばmオプションを付けない場合、行頭を表す ^  と行末を表す $  は文字列全体の最初と最後だけにしかマッチできません。

例えば次のコードを考えてみてください。

上のコードではテンプレートリテラルを使って複数行を定義、

1行ごとに行頭から行末までの間を 'piyo piyo piyo'  で置き換えしようとしてます。

ですがこの場合だと文字列全部が 'piyo piyo piyo'  に置換されてしまいました。

それは ^  と $  が文字列全体の初めと終わりを表してしまうからです。

 

なので各行ごとにマッチさせるにはmオプションが必要です。

つまり先ほどの例なら次のようにする必要があるということ

こうすれば ^  と $  は各行の最初と最後にマッチしてくれるようになります。

uオプション

正規表現内でユニコード値を表したい場合に必要なオプション

ユニコード値については次ページを見ると分かりやすいです。

例えばユニコード値が16進数で 308F  なら正規表現だと \u{308F}  で表せます。

基本的にはあまり使うことがないオプションですね。

 

以下uオプションの使用コード例

「あ」のユニコード値は 3042  なので正規表現だと \{3042}  で表せます。

こういう風にユニコードでパターン指定したい場合などに使うみたいです。

ちなみにPHPでは・・・

以上4つがJavaScriptで使える正規表現オプション

ちなみにPHPでも同じようなオプションが存在します。

PHPで使える主なオプションは次の6つ

  • iオプション
  • mオプション
  • sオプション
  • xオプション
  • Aオプション
  • Uオプション

詳しくは次記事でまとめました。

PHPとJavaScriptでは使えるオプションがかなり違います。

ここまでのまとめ

ということ各オプションをもう一度まとめ

  • gオプション
    文字列全てで繰り返しパターンをマッチさせる。いわゆるグローバルサーチ
  • iオプション
    小文字や大文字の区別をせずにパターンをマッチさせる
  • mオプション
    文字列が複数行の場合、 ^  と $  を各行の最初と最後にマッチさせる
  • uオプション
    ユニコード値で文字をマッチさせる。あまり使わないオプション

gオプションやiオプションはよく使うことが多いと思います。

以上JavaScript正規表現で使えるオプションについてまとめました。