大約一週前,我在編輯一個程式時想要更改一些變數名。我之前認為這將是一個簡單的正則運算式查詢/替換。只是這沒有我想象的那麼簡單。
變數名為 a10
、v10
和 x10
,我想分別將它們改為 a30
、v30
和 x30
。我想到使用 BBEdit 的查詢視窗並輸入:
Mistaken BBEdit replacement pattern
我不能簡單地 30
替換為 10
,因為程式碼中有一些與變數無關的數字 10
。我認為我很聰明,所以我不想寫三個非正則運算式替換,a10
、v10
和 x10
,每個一個。但是我卻沒有註意到替換樣式中的藍色。如果我這樣做了,我會看到 BBEdit 將我的替換樣式解釋為“匹配組 13,後面跟著 0
,而不是”匹配組 1,後面跟著 30
,後者是我想要的。由於匹配組 13 是空白的,因此所有變數名都會被替換為 0
。
你看,BBEdit 可以在搜尋樣式中匹配多達 99 個分組,嚴格來說,我們應該在替換樣式中取用它們時使用兩位數字。但在大多數情況下,我們可以使用 \1
到 \9
而不是 \01
到 \09
,因為這沒有歧義。換句話說,如果我嘗試將 a10
、v10
和 x10
更改為 az
、vz
和 xz
,那麼使用 \1z
的替換樣式就可以了。因為後面的 z
意味著不會誤解釋該樣式中 \1
。
因此,在撤消替換後,我將樣式更改為這樣:
Two-digit BBEdit replacement pattern
它可以正常工作。
還有另一個選擇:命名組。這是使用 var
作為樣式名稱:
Named BBEdit replacement pattern
我從來都沒有使用過命名組,無論正則運算式是在文字編輯器還是在指令碼中。我的總體感覺是,如果樣式複雜到我必須使用變數來跟蹤所有組,那麼我應該停下來並將問題分解為更小的部分。
順便說一下,你可能已經聽說 BBEdit 正在慶祝它誕生25週年[1]。當一個有良好檔案的應用有如此長的歷史時,手冊的積累能讓人愉快地回到過去的日子。當我在 BBEdit 手冊中查詢命名組的表示法時,我遇到了這個說明:
BBEdit regex manual excerpt
BBEdit 目前的版本是 12.5。第一次出現於 2001 年的 V6.5。但手冊希望確保長期客戶(我記得是在 V4 的時候第一次購買)不會因行為變化而感到困惑,即使這些變化幾乎發生在二十年前。
via: https://leancrew.com/all-this/2019/02/regex-groups-and-numerals/
作者:Dr.Drang[3] 選題:lujun9972 譯者:geekpi 校對:wxy