透過 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) 面板中,正規表達式預設是不比對換行符號的。
要解決這個問題,您需要做兩件事:
- 啟用「點號比對新行」(Dot Matches Newline)模式:在 Sublime Text 的尋找面板中,這通常對應於一個特殊的模式修飾符或一個按鈕。
- 調整您的正規表達式:確保它能處理換行。
解決方案
1. 使用模式修飾符(推薦)
在 Sublime Text 的正規表達式引擎(預設是基於 Boost 的 PCRE)中,您可以在表達式的開頭添加 (?s)
修飾符來啟用「點號比對新行」(s
代表 single-line mode 或 dot-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>
,它會擷取到:
class="style-scope ytd-playlist-panel-video-renderer"
>
\n
(換行符號)Hgfdoi
\n
(換行符號)
如果您只想提取 Hgfdoi
,並且處理所有屬性和空白字元,更精確的表達式是:
程式碼片段
(?s)<span id="byline".*?>(.*?)</span>
(?s)
: 開啟比對換行。<span id="byline"
: 比對起始。.*?
: 非貪婪地比對所有屬性直到>
符號。>
: 比對起始標籤的結束符號。(.*?)
: 擷取群組,擷取您想要的文字(Hgfdoi
和周圍的空白換行)。</span>
: 比對結束標籤。