2021年11月1日

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

複数行モードはフラグ m によって有効になります。

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

複数行モードでは、文字列の先頭と末尾だけでなく、行の先頭/末尾にも一致します。

行頭 ^ での検索

以下の例では、テキストは複数行です。パターン /^\d/gm は各行の先頭から数字を取得します。

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

console.log( str.match(/^\d/gm) ); // 1, 2, 3

フラグ m がない場合、最初の数字のみが一致します。

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

console.log( str.match(/^\d/g) ); // 1

これは、デフォルトではキャレット ^ はテキストの先頭にのみ一致し、複数行モードでは任意の行の先頭に一致するためです。

ご注意ください

「行頭」は正式には「改行の直後」を意味します。複数行モードでのテスト ^ は、改行文字 \n の前のすべての位置に一致します。

そして、テキストの先頭にも一致します。

行末 $ での検索

ドル記号 $ も同様に動作します。

正規表現 \d$ は、すべての行の最後の数字を見つけます。

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

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

フラグ m がない場合、ドル $ はテキスト全体の末尾にのみ一致するため、最後の数字のみが見つかります。

ご注意ください

「行末」は正式には「改行の直前」を意味します。複数行モードでのテスト $ は、改行文字 \n の後のすべての位置に一致します。

そして、テキストの末尾にも一致します。

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

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

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

ここでは、\d$ の代わりに \d\n を検索します

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

console.log( str.match(/\d\n/g) ); // 1\n,2\n

ご覧のとおり、3つではなく2つの一致があります。

3 の後には改行がないためです(ただし、テキストの末尾はあるため、$ に一致します)。

もう1つの違い: अब प्रत्येक मिलान में एक नई पंक्ति वर्ण \n शामिल है। एंकर ^ $ के विपरीत, जो केवल स्थिति (एक पंक्ति की शुरुआत/अंत) का परीक्षण करते हैं, \n एक वर्ण है, इसलिए यह परिणाम का हिस्सा बन जाता है.

つまり、パターン内の \n は結果に改行文字が必要な場合に使用され、アンカーは行の先頭/末尾にあるものを見つけるために使用されます。

チュートリアルマップ

コメント

コメントする前にこれを読んでください…
  • 改善の提案がある場合は、コメントする代わりに GitHub の issue またはプルリクエストを送信してください。
  • 記事の内容が理解できない場合は、詳しく説明してください。
  • 短いコードを挿入するには <code> タグを使用し、複数行の場合は <pre> タグで囲み、10行を超える場合はサンドボックス(plnkrjsbincodepen…)を使用してください。