Sublime Text 的「尋找」的正規表達式預設是不比對換行符號

透過 sublime 想移除某一個 html 的 tag, 直接使用 <tab .*/tag>在沒有遇到換行符號都沒問題, 但有換行時就無法選取到換行後的內容。

解法是把 .* 換成 ([\s\S]*?)

原始的 html:

<div id="byline-container" class="style-scope ytd-playlist-panel-video-renderer">
<span id="byline" class="style-scope ytd-playlist-panel-video-renderer">
Hgfdoi
</span>
</div>

在 Sublime Text 的「尋找」(Ctrl+F 或 Cmd+F) 或「在檔案中尋找」(Ctrl+Shift+F 或 Cmd+Shift+F) 面板中,正規表達式預設是不比對換行符號的。

要解決這個問題,您需要做兩件事:

  1. 啟用「點號比對新行」(Dot Matches Newline)模式:在 Sublime Text 的尋找面板中,這通常對應於一個特殊的模式修飾符或一個按鈕。
  2. 調整您的正規表達式:確保它能處理換行。

解決方案

1. 使用模式修飾符(推薦)

在 Sublime Text 的正規表達式引擎(預設是基於 Boost 的 PCRE)中,您可以在表達式的開頭添加 (?s) 修飾符來啟用「點號比對新行」(s 代表 single-line modedot-all)。

修改後的正規表達式:

程式碼片段

(?s)<span id="byline" (.*?)</span>

解釋:

  • (?s): 啟用單行模式。在這個模式下,點號 (.) 會比對包括換行符號在內的任何字元。
  • <span id="byline" : 比對起始部分。
  • (.*?): 非貪婪地擷取中間的所有內容,包括屬性和標籤內的文字。
    • *? 確保它只比對到最近的 </span> 標籤。
  • </span>: 比對結束標籤。

2. 使用專門比對任何字元的表達式(替代方案)

如果您不想使用 (?s) 修飾符,您可以將 . 替換為能夠比對任何字元組合的模式,例如:

程式碼片段

<span id="byline" ([\s\S]*?)</span>

解釋:

  • [\s\S]: 這是一個字元集,它比對:
    • \s: 任何空白字元(包括空格、製表符、換行符號)。
    • \S: 任何非空白字元。
    • 結合起來,它比對所有字元。
  • [\s\S]*?: 非貪婪地比對所有內容。

⚠️ 額外的建議 (針對您的 HTML 結構):

如果您只需要擷取 <span> 標籤內部的文字,您的原始 HTML 結構是:

HTML

<span id="byline" class="style-scope ytd-playlist-panel-video-renderer">
    Hgfdoi
</span>

如果您使用 (?s)<span id="byline" (.*?)</span>,它會擷取到:

  1. class="style-scope ytd-playlist-panel-video-renderer"
  2. >
  3. \n(換行符號)
  4. Hgfdoi
  5. \n(換行符號)

如果您只想提取 Hgfdoi,並且處理所有屬性和空白字元,更精確的表達式是:

程式碼片段

(?s)<span id="byline".*?>(.*?)</span>
  • (?s): 開啟比對換行。
  • <span id="byline": 比對起始。
  • .*?: 非貪婪地比對所有屬性直到 > 符號。
  • >: 比對起始標籤的結束符號。
  • (.*?): 擷取群組,擷取您想要的文字(Hgfdoi 和周圍的空白換行)。
  • </span>: 比對結束標籤。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *