2019年11月27日

アンカー ^ $ の複数行モード, フラグ "m"

フラグ m で、複数行モードを有効にできます。

これは ^$ の動作にのみ影響します。

複数行モードでは、文字列の始めと終わりだけでなく、行の始まりと終わりにもマッチします。

行の開始 ^ の検索

下の例では、テキストは複数行です。パターン /^\d+/gm はそれぞれの行の先頭から数字を取ります。:

let str = `1st place: Winnie
2nd place: Piglet
33rd place: Eeyore`;

alert( str.match(/^\d+/gm) ); // 1, 2, 33

m フラグがない場合は、最初の数値だけがマッチします:

let str = `1st place: Winnie
2nd place: Piglet
33rd place: Eeyore`;

alert( str.match(/^\d+/g) ); // 1

これは、デフォルトではキャレット ^ はテキストの先頭にのみマッチし、複数行モードでは – 行の始まりがマッチするためです。

注意:

“行の開始” は正式には “改行の直後” を意味します: 複数行モードでの ^ は改行文字 \n が前にあるすべての位置にマッチします。

行の終わり $ の検索

ドル記号 $ も同様に振る舞います。

正規表現 \d$ は各行で最後の数字を見つけます。:

let str = `Winnie: 1
Piglet: 2
Eeyore: 3`;

alert( str.match(/\d$/gm) ); // 1,2,3

フラグ m がなければ、ドル $ は文字列全体の終わりにのみマッチします。なので、最後の数字だけが見つかるでしょう。

注意:

“行の終わり” は正式には “改行の直前” を意味します: 複数行モードでの $ は改行文字 \n が続くすべての位置にマッチします。

^ $ の代わりに \n を検索する

改行を見つけるには、アンカー ^$ だけでなく、改行文字 \n を使うこともできます。

違いは何でしょう?例を見てみましょう。

ここでは \d$ の代わりに \d\n を使って検索します:

let str = `Winnie: 1
Piglet: 2
Eeyore: 3`;

alert( str.match(/\d\n/gm) ); // 1\n,2\n

ご覧の通り、3つではなく2つマッチします。

これは 3 の後に改行がないためです(ですがテキストの終わりはあるので、$ にはマッチします)。

もう1つの違い: すべてのマッチ結果には、改行文字 \n を含みます。アンカー ^ $ (条件(行の開始/終了)のみのテスト)とは異なり、\n は文字なので、結果に含まれます。

したがって、パターンの \n は、結果に改行を含めたいときに利用され、アンカーは行の先頭/末尾を探したいときに使われます。

チュートリアルマップ