複数行モードはフラグ 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
は結果に改行文字が必要な場合に使用され、アンカーは行の先頭/末尾にあるものを見つけるために使用されます。
コメント
<code>
タグを使用し、複数行の場合は<pre>
タグで囲み、10行を超える場合はサンドボックス(plnkr、jsbin、codepen…)を使用してください。