複数行モード, フラグ "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

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

正規表現エンジンはテキストに沿って進み、^ で始まる文字列を探し、見つけたとき – パターン \d+ の残りの部分のマッチを続けます。

行の終わり $

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

正規表現 \w+$ は各行で最後の単語を見つけます。:

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

alert( str.match(/\w+$/gim) ); // Winnie,Piglet,Eeyore

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

アンカー ^$ vs \n

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

最初の違いは、アンカーとは異なり、文字 \n は改行文字を “消費” し、結果にそれを追加することです。

例えば、ここでは $ の代わりに \n を使っています:

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

alert( str.match(/\w+\n/gim) ); // Winnie\n,Piglet\n

ここでは、すべてのマッチは単語に改行文字を加えたものです。

そして、もう1つの違いは – 改行 \n は文字列の末尾にはマッチしないことです。そのため、Eeyore は上の例では見つかりませんでした。

したがって、通常はアンカーのほうが優れています。それらは我々が欲しいものにより近いです。

チュートリアルマップ

コメント

コメントをする前に読んでください…
  • 自由に記事への追加や質問を投稿をしたり、それらに回答してください。
  • 数語のコードを挿入するには、<code> タグを使ってください。複数行の場合は <pre> を、10行を超える場合にはサンドボックスを使ってください(plnkr, JSBin, codepen…)。
  • 記事の中で理解できないことがあれば、詳しく説明してください。