文字與日常工具·文字工具包
為什麼尋找和取代工具必須在半類型正規表示式中生存
· 為什麼它很重要
尋找和替換 正規表示式 文字編輯
鍵入模式是增量的,因此單獨的左括號是正常狀態;這篇文章認為,保護編譯、保持文字不變以及提供撤銷功能是正確性功能,而不是修飾功能。
清理不平衡支架上的盒子的工具 - 一次擊鍵如何毀掉一小時的清理工作
尋找和取代框通常包含比其旁邊的搜尋模式花費更長時間來組裝的工作。如果不完整的表達式可能會拋出介面、清除編輯器或使其狀態不確定,那麼該工具就會使模式輸入比它本來要簡化的清理任務更加危險。
儲存庫沒有記錄 ToolAcre 刪除一小時工作的具體事件,因此該故事不能作為事實呈現。無論如何,可辯護的要求更強:每當模式編譯失敗時,使用者文字必須保持不變,無論存在多少文字或準備需要多長時間。
尋找和取代工具必須防止的破壞性故障
正規表示式通常不是透過一次完美的按鍵輸入的。人們在右括號之前鍵入左括號,或在新增其成員之前以左括號開始字元類別。在這些時刻,即使編輯過程正常進行,該欄位仍包含語法不完整的模式。
將臨時狀態視為異常使用者行為會產生一個脆弱的編輯器。有用的回應是立即的本地回饋:顯示當前模式無法編譯,保留所有其他欄位,並讓下一次擊鍵修復它。無效的正規表示式錯誤應該描述目前草稿,而不是終止工作流程。
寫正規表示式時,不完整的模式是正常的
ToolAcre 透過 `compilePattern` 路由每個使用者提供的搜尋。文字搜尋首先轉義正規表示式元字符,而正規表示式模式則直接使用提供的來源。編譯發生在 `try` 區塊內,失敗回傳一個空模式加上錯誤字串,而不是允許 JavaScript 異常逃逸到介面中。
此結果控制替換路徑。 When compilation reports an error, `findReplace` returns the original text, zero replacements and the error.它不會嘗試部分搜尋或重寫。因此,此防護可以保護介面穩定性和資料完整性:沒有有效模式意味著編輯器內容不會發生突變。
報告發生的情況 - 為什麼每次執行後的替換計數是最快的健全性檢查
成功的替換在邏輯上仍然可能是錯誤的。廣泛的表達式可能會匹配比預期更多的日期,而大小寫選項或全字邊界可能會將集合減少為零。 ToolAcre 在调用標准字符串替換之前對匹配項进行計數,並使用重寫的文字返回该數字,從而使范围在每次執行後可见。
計數是一種快速的健全性檢查,而不是證明每場比賽都是理想的。如果預期有 12 個記錄且結果顯示 1 或 1,200,請在複製輸出之前停止並檢查模式。精確的數字可以將模糊的懷疑變成撤銷和修改搜尋的具體理由。
撤銷作為安全網 — 每個轉換都是可逆的,記錄的操作限制為 50 次
編譯安全性可以防止無效模式更改文字,但有效模式仍然可以表達錯誤的意圖。撤消涵盖了第二類。文字工具包記錄轉換,以便在結果計數或輸出顯示搜尋太寬、太窄或錯誤分組後可以撤銷已完成的替換。
記錄的歷史限制是五十個操作,因此撤銷是工作緩衝區而不是永久版本控制。用它來進行小步驟的實驗,但不要將其視為檔案儲存。對於重要材料,請單獨保留原始材料,並僅在檢查文字和替換計數後才複製完成的輸出。
工作範例 — 逐個字元建構日期重新格式化模式並觀察錯誤的出現和消失而不遺失文字
考慮將日期從 `2024-01-02` 變更為 `02/01/2024`。启用正則表達式並以左括号開头。此時,瀏覽器引擎會報告無效表達式,ToolAcre 會顯示訊息,且文字保持不變。加上 `\d{4}` 和右括號,第一個捕獲的年份將變得有效。
繼續,直到搜尋到 `(\d{4})-(\d{2})-(\d{2})`,然後使用 `$3/$2/$1` 作為替換。這三個捕獲重新排序年、月和日,而無需重新鍵入每一行。執行全部替換,將報告的計數與預期的行進行比較,如果不相關的數字文字也匹配,則立即撤消。
這不包括什麼 - 正規表示式效能問題,例如巨大輸入上的災難性回溯
The compilation guard addresses syntax errors, not the running time of valid expressions.模式可以成功編譯,但會對特定輸入進行大量回溯。由於替換在主執行緒上運行,因此即使沒有引發異常,應用於大型文件的病態表達式仍然可能導致瀏覽器標籤無回應。
該工具還執行全部替換而不是逐一匹配,並在突變之前不會預覽突出顯示的匹配。這些限制使得狹窄的測試資料和替換計數變得非常重要。在將其應用於大型檔案的唯一副本之前,先在小型代表性樣本上驗證不熟悉的表達式。
要點 — 文字工具包將無效模式視為訊息,而不是失敗,因此您可以安全地進行實驗
不完整模式是有關編輯狀態的信息,而不是使用者失敗的證據。 ToolAcre 在其返回值中保留了這種区別:編譯可以报告錯誤而不引發錯誤,替換可以报告零更改而不觸及源代碼,成功的操作可以准确报告它重寫了多少個匹配項。
此設計支援實驗,而無需假裝正規表示式是無害的。保留編譯失敗時的輸入,檢查成功後的計數,並在有效模式概念上錯誤時使用撤銷。這些行為一起使得尋找和替換對於偶爾的正規表示式使用者來說足夠可預測,他們需要反饋而不是對半類型表達式的懲罰。