JavaScriptの正規表現はいくつか表し方があります。
それは次のように正規表現リテラルを使う方法とRegExpオブジェクトを使う2通り
1 2 3 4 5 |
/** 正規表現リテラルで宣言 */ var regexp = /target/; /** RegExpオブジェクトとして宣言 */ var regexp = new RegExp('target'); |
この2つの使い方やパフォーマンス的な違いは次でもまとめました。
それでこれら正規表現にはオプション(フラグ)を付けることもできます。
例えばリテラルの場合は最後のスラッシュ( / )の後、RegExpの場合は第2引数にオプションを文字列として渡すことが可能
1 2 3 4 5 |
/** 正規表現リテラルの場合 */ var regexp = /hoge/gm /** RegExpオブジェクトの場合 */ var regexp = new RegExp('hoge', 'gm'); |
最後についている g とか m とかの文字がオプション
全てのオプションはこのように1文字で表され、
- グローバルサーチ
- 小文字・大文字の区別
- 複数行検索
などの高度な検索をするために使われます。
そこでここではJavaScriptの正規表現内で使えるオプションについてまとめてみました。
時々忘れがちになるので自分の記憶の整理も兼ねて紹介します。
正規表現に使える4つのオプション(フラグ)
JSの正規表現で利用可能なオプションは次の4つ
- gオプション
- iオプション
- mオプション
- uオプション
gオプション
これはグローバルサーチをするために使われるオプション
つまり文字列全体で見つかった全てのパターンにマッチさせるという意味です。
ではまずgオプションを使わないとどうなるか考えてみます。
例えば次は文字列 text に対してreplaceメソッドを使って 'hoge' を 'piyo' に置換しているコード
1 2 3 4 5 6 7 |
var regexp = /hoge/; var text = 'hoge hoge hoge'; var substr = 'piyo'; text = text.replace(regexp, substr); console.log(text); /// => piyo hoge hoge |
この場合、gオプションはついてないので最初の 'hoge' だけ置換されます。
つま置換後のテキストは 'piyo hoge hoge' のようになるということ
gオプションを付けないと、このように一度しか検索・置換されません。
一方で次はgオプションを付けた場合のコード
1 2 3 4 5 6 7 |
var regexp = /hoge/g; var text = 'hoge hoge hoge'; var substr = 'piyo'; text = text.replace(regexp, substr); console.log(text); /// => piyo piyo piyo |
見てわかるように /hoge/ から /hoge/g と変更してあります。
こうすればパターンが繰り返し置換されるので、置換後テキストは 'piyo piyo piyo' となります。
以上がgオプションの意味と使い方
あるパターンを繰り返し置換したり検索したい場合は必須のオプションです。
iオプション
これ小文字と大文字を区別しないで検索・置換するためのオプション
例えばマッチさせるときに小文字の「a」と大文字の「A」は同じと扱われます。
こちらもiオプションを使わない場合から考えてみましょう。
例えば次は文字列 text 内にある 'hoge' を 'PIYO' に置換しようとしてるコード例
1 2 3 4 5 6 7 |
var regexp = /hoge/g; var text = 'HOGE HOge hoge'; var substr = 'PIYO'; text = text.replace(regexp, substr); console.log(text); /// => HOGE HOge PIYO |
当然小文字だけの 'hoge' しか 'PIYO' に置換されません。
なので置換後のテキストは 'HOGE HOge PIYO' となります。
一方で次はiオプションを付けた場合のコード
1 2 3 4 5 6 7 |
var regexp = /hoge/ig; var text = 'HOGE HOge hoge'; var substr = 'PIYO'; text = text.replace(regexp, substr); console.log(text); /// => PIYO PIYO PIYO |
/hoge/ig のようにgオプションの前にiオプションを付けました。
そうすると置換後のテキストは 'PIYO PIYO PIYO' となります。
このように小文字・大文字関係なしで検索・置換できるのがiオプションのメリットです。
mオプション
これは対象のテキストを複数行として扱うためのオプション
逆に言えばmオプションがないと、どんなテキストでも1行として扱われるという意味です。
これがどんな場面で役立つかというと各行の最初と末尾にマッチさせたい場合
例えばmオプションを付けない場合、行頭を表す ^ と行末を表す $ は文字列全体の最初と最後だけにしかマッチできません。
例えば次のコードを考えてみてください。
1 2 3 4 5 6 7 8 9 10 11 |
var regexp = /^(hoge(|\s+))+$/g; var text = ` hoge hoge hoge hoge hoge hoge hoge hoge hoge `.trim(); var substr = 'piyo piyo piyo'; text = text.replace(regexp, substr); console.log(text); /// => piyo piyo piyo |
上のコードではテンプレートリテラルを使って複数行を定義、
1行ごとに行頭から行末までの間を 'piyo piyo piyo' で置き換えしようとしてます。
ですがこの場合だと文字列全部が 'piyo piyo piyo' に置換されてしまいました。
それは ^ と $ が文字列全体の初めと終わりを表してしまうからです。
なので各行ごとにマッチさせるにはmオプションが必要です。
つまり先ほどの例なら次のようにする必要があるということ
1 |
var regexp = /^(hoge(|\s+))+$/mg; |
こうすれば ^ と $ は各行の最初と最後にマッチしてくれるようになります。
uオプション
正規表現内でユニコード値を表したい場合に必要なオプション
ユニコード値については次ページを見ると分かりやすいです。
例えばユニコード値が16進数で 308F なら正規表現だと \u{308F} で表せます。
基本的にはあまり使うことがないオプションですね。
以下uオプションの使用コード例
1 2 3 4 5 6 7 |
var regexp = /\u{3042}/gu; var text = 'あああ'; var substr = '亜'; text = text.replace(regexp, substr); console.log(text); /// => 亜亜亜 |
「あ」のユニコード値は 3042 なので正規表現だと \{3042} で表せます。
こういう風にユニコードでパターン指定したい場合などに使うみたいです。
ちなみにPHPでは・・・
以上4つがJavaScriptで使える正規表現オプション
ちなみにPHPでも同じようなオプションが存在します。
PHPで使える主なオプションは次の6つ
- iオプション
- mオプション
- sオプション
- xオプション
- Aオプション
- Uオプション
詳しくは次記事でまとめました。
PHPとJavaScriptでは使えるオプションがかなり違います。
ここまでのまとめ
ということ各オプションをもう一度まとめ
- gオプション
文字列全てで繰り返しパターンをマッチさせる。いわゆるグローバルサーチ
- iオプション
小文字や大文字の区別をせずにパターンをマッチさせる
- mオプション
文字列が複数行の場合、 ^ と $ を各行の最初と最後にマッチさせる
- uオプション
ユニコード値で文字をマッチさせる。あまり使わないオプション
gオプションやiオプションはよく使うことが多いと思います。
以上JavaScript正規表現で使えるオプションについてまとめました。