多行模式由旗標 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\n
而不是 \d$
let str = `Winnie: 1
Piglet: 2
Eeyore: 3`;
console.log( str.match(/\d\n/g) ); // 1\n,2\n
正如我們所見,有 2 個比對結果,而不是 3 個。
那是因為在 3
後面沒有換行(儘管有文字結尾,因此會比對到 $
)。
另一個差別:現在每個比對結果都包含一個換行字元 \n
。與只會測試條件(行首/行尾)的錨定符號 ^
$
不同,\n
是個字元,因此會成為結果的一部分。
因此,當我們需要在結果中使用換行字元時,會使用模式中的 \n
,而錨定符號則用於在行首/行尾尋找某個東西。
留言
<code>
標籤,對於多行 - 將它們包裝在<pre>
標籤中,對於超過 10 行 - 使用沙盒 (plnkr、jsbin、codepen…)