文字與正規表示式
檢查正規表示式是否符合所需內容
使用工具
正則找到一個目標值,就容易讓人覺得完成了。更難發現的是誤抓相似值或悄悄漏掉特殊行。先準備短文字與明確預期,再逐項加條件,比一開始寫複雜運算式更容易維護。
這裡使用虛構訂單 ID。工具採用 JavaScript 正則,運算式和旗標分開填寫。處理敏感日誌前,先用小例子區分完整符合、擷取群組和取代後文字。
放入兩個目標與兩個排除例
order-104
order-205
preorder-306
order-407xorder-([0-9]+)使用 gm 旗標會符合四處:preorder-306 含 order-306,order-407x 以 order-407 開頭。包含目標兩項並不夠,還缺少整行必須是訂單 ID 的條件。
要符合整行,就確定起點與終點
^order-([0-9]+)$加 ^、$ 並用 gm 後,只剩 order-104 與 order-205。m 讓錨點作用於各行邊界;只有 g 沒有 m 時,四行整體不是一個完整 ID,因而不符合。全域比對與多行錨點是不同功能。
SheepDev 目前會在內部補 g 來列出符合項,刪掉它不會變成只測第一項。目標程式若只處理首項,應另行驗證呼叫方式。同一運算式在不同 API 或旗標下會有不同結果。
區分完整符合與擷取數字
([0-9]+) 的括號擷取數字,完整符合是 order-104,群組 1 是 104,可適用於其他 ID 而非寫死一個值。+ 至少要求一位數字,所以 order- 不符合。是否允許空數字應另作規格決定。
此式不接受全形數字、正負號或分組符號。若要允許 order-012,應明確條件並加測試。擷取到的 001 也不應自動轉成數字 1,下游需保留識別語意。
取代會保留未符合的行
ID:$1ID:104
ID:205
preorder-306
order-407x$1 插入第一個擷取群組,只把符合的兩行改成 ID:104、ID:205,其他行保留。要區分只取擷取值,還是改寫原文。把取代結果誤作擷取清單,就會覺得排除行又混進來了。
新增擷取括號可能改變群組編號,修改運算式後要重新檢查取代引用,不能假定意義不變。取代字串也有特殊語法。大範圍套用前,測試符合行、不符合行和近乎空行。
運算式輸入框不是原始碼字串
這裡填運算式本體,不用斜線包圍,也不在末尾附 gm,旗標另填。原始碼字串可能還要多一層反斜線跳脫。頁面有效而程式無效時,要區分正則語法和包裹它的字串語法。
其他語言或資料庫可能使用不同正則方言。這裡成功不保證可移植,應檢查目標旗標、Unicode、語法與取代群組引用,再執行相同正反例。
逾時不等於沒有符合項
有些運算式在輸入稍長時計算量就激增。工具在 Worker 中執行,約一秒截止。逾時表示未完成,不代表沒有符合項。評估時除短成功例,還要測試較長失敗例。
文字和運算式大小受限,符合清單最多顯示 5,000 項。滿清單不證明總符合數就是這些。正式驗證或日誌彙整仍需自己的限制與失敗策略,複製運算式不會帶走此工具的逾時保護。
增加相似但不應符合的反例
訂單編號式子符合一例不代表完成。加上前綴、多餘後綴、少一位數字等反例。部分符合用於擷取可能正確,用於驗證整行卻可能錯誤。除了數量,還要看反白範圍,區分擷取子字串與驗證整體。
數字語法也有前提。JavaScript 一般 \d 不會自動把全形123當 ASCII 數字。先正規化還是允許其他字元集,應由資料規則決定。忽略大小寫旗標也不表示 ID 本來就不區分大小寫;應讓式子符合規則,而非為通過範例放寬規則。
將正例反例一起帶入應用測試。JavaScript 式子移到其他引擎時,應複查旗標、分組、換行和取代語法。這裡一秒內結束不保證任意長度或環境都快,還要測較長的不符合輸入,不能把逾時當作合法空結果。