文字與日常工具·文字工具包
為什麼 ^ 和 $ 只匹配一次:瀏覽器中的正規表示式標誌查找和替換
· 工作原理
正規表示式 尋找和替換 文字清理
解釋了 JavaScript 正規表示式標誌 - 全域、多行和 dotAll - 以及為什麼查找和替換框在沒有多行錨點 ^ 和 $ 的情況下編譯到整個文字,而是使用有效的模式。
僅修復第一行的模式 - 當您期望 ^ 表示「每行的開頭」時會發生什麼
貼上的清單可能在每一行上包含相同的不需要的前綴,但搜尋 `^prefix` 只會將其從第一行中刪除。令人驚訝的結果來自模式配置,而不是不一致的資料。在 ToolAcre 中,`^` 標識完整文字的開始,因為正規表示式是在沒有多行模式的情況下編譯的。
匹配的 `$` 錨點在另一個邊緣遵循相同的規則:它標識整個文字的結尾,而不是其中結尾的每一行。換行符仍然是輸入的一部分,但不會成為另一個錨點位置。在匯入清理清單之前檢查報告的替換計數;計數到一就會立即暴露出不匹配的情況。
g 標誌 — 為什麼「一次替換所有匹配項」取決於設定的全域標誌
ToolAcre 始終使用全域 `g` 標誌建立其搜尋模式。這個選擇告訴 JavaScript 收集每個不重疊的匹配項,而不是在第一個匹配項之後停止。工具首先呼叫 `match` 來決定計數,然後將相同的全域模式傳遞給 `replace`,因此顯示的數字和替換傳遞使用一個符合規則。
全域匹配無法建立模式無法辨識的位置。對於 `^prefix`,只有一個符合條件的全篇開頭,因此 `g` 仍會找到一個符合項目。對於可以出現在多行上的模式,`g` 允許取代所有出現的情況。調試時將這些問題分開:錨點決定匹配可以從哪裡開始,而全域模式決定搜尋是否繼續。
m 標誌 — 多行如何將 ^ 和 $ 從全文字錨點更改為行錨點,以及該工具為何忽略它
多行 `m` 標誌變更 `^` 和 `$` 的解釋方式,允許它們識別行終止符周圍的位置以及外部文字邊界。 ToolAcre 沒有添加該標誌。其編譯器使用 `g` 進行區分大小寫的搜索,並在清除區分大小寫時使用 `gi`,而使用者無法控制其他標誌。
使多行不可用會使介面變小,但這表示從配置有 `gm` 的編輯器複製的模式在此可能表現不同。不要假設一個熟悉的表達方式帶有它的標誌。建立 RegExp 時會提供 JavaScript 標誌字母,並該工具會拒絕不支援的內聯標誌語法,而不是默默地啟用另一種模式。
s 標誌 — 為什麼點預設不匹配換行符,以及如何在沒有它的情況下跨行匹配
此工具中的點與換行符不匹配,因為編譯器也忽略了 dotAll `s` 標誌。當兩個標記都在一行上時,諸如 `BEGIN.*END` 之類的模式可以匹配,但當標記跨越多行時,它會在第一個換行符處停止。新增全域模式不會改變點本身可以消耗的內容。
當確實需要跨行匹配時,請明確寫入允許的字元。像 `[\s\S]*?` 這樣的類別可以跨越空白和非空白,同時仍然不情願,儘管廣泛的模式值得首先在小樣本上進行測試。編譯器會捕獲無效語法,但它不會保護分頁免受具有嚴重回溯行為的昂貴表達式的影響。
明確匹配換行符號 - 當多行不可用時,在模式中使用 \n 來定位行的開始和結束
對於沒有多行模式的重複行開頭,請與文字的開頭或換行符相符:`(^|\n)prefix`。第一個替代方案處理第一行,第二個替代方案透過消耗其前面的換行符號來處理後面的行。括號捕獲匹配的邊界,為替換提供了保留分隔行的結構的方法。
此技術假定模式中存在換行分隔符號。文字庫在執行專用行操作時識別 CRLF、LF 和單獨的 CR,但尋找和取代直接搜尋原始字串。如果貼上的內容使用其他行結束形式,請先對其進行規範化或有意調整表達方式;否則後面的行可能保持不變,即使它們在螢幕上看起來相同。
使用 (^|\n) 明確匹配行邊界並保留捕獲的分隔符
假設輸入為 `ID: apple`、`ID: pear` 和 `ID: plum`,位於不同的行上。啟用正規表示式,找到 `(^|\n)ID: `,並取代為 `$1`。在第一行,`$1` 是空的起始位置;在後面的行中,它是被捕獲的換行符。標籤消失,而所有三行邊界保持不變。
在接受結果之前讀取替換計數。在此範例中,三行應產生三個替換。如果計數為 1,請檢查實際模式和行結尾,而不是重複操作。替換後可以進行撤消,因此在同一表達式接觸較長的導入清單之前,進行一次小型試驗即可確認匹配和重建。
這不包括 - u、i 和 y 標誌,以及在替換中插入換行符,這是單行欄位無法做到的
當關閉區分大小寫時,此實作也會使用 `i`,但它不公開對 `u`、`y`、`m` 或 `s` 的控制項。除了解釋範例所需的缺少的多行和 dotAll 效果之外,本文不會將行為分配給那些不可用的模式。來自另一個 JavaScript 環境的模式必須根據 ToolAcre 實際編譯的標誌進行審查。
原始碼證明替換文字已傳遞給 JavaScript `String.replace`,因此 `$1`、`$&` 和 `$$` 等替換保留其 JavaScript 意義。它不會根據此處使用的檔案建立渲染欄位提供的所有互動。特別是,應測試透過介面插入物理換行符,而不是僅從大綱中推斷。
其他標誌和替換欄位行為不在此工具實作之外
將標誌視為正規表示式的一部分,即使介面僅顯示模式主體也是如此。在 ToolAcre 中,每次搜尋都是全域的,可選的不區分大小寫模式會新增 `i`,不存在 multiline 和 dotAll。這些事實解釋了為什麼在普通匹配中繼續替換,而 `^`、`$` 和點保留其預設的全文字和單行約束。
對於帶有前綴的貼上列表,`(^|\n)prefix` 和 `$1` 是實際的解決方法,因為它命名邊界並保留它。從代表性行開始,確認計數,檢查產生的行結構,然後才處理完整的資料集。這個過程將令人費解的一場比賽結果轉變為導入前可審查的清理步驟。