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\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,而錨定符號則用於在行首/行尾尋找某個東西。

教學課程地圖

留言

在評論前請先閱讀…
  • 如果您有建議要改進 - 請 提交 GitHub 問題 或提交拉取請求,而不是評論。
  • 如果您無法理解文章中的某些內容 – 請說明。
  • 要插入幾行程式碼,請使用 <code> 標籤,對於多行 - 將它們包裝在 <pre> 標籤中,對於超過 10 行 - 使用沙盒 (plnkrjsbincodepen…)