Visual Studio 小技巧 - Regular Expression 尋找取代
8 |
分享 Visual Studio 小技巧一則。
直接用實例示範比較快,前篇文章提到nameof(Stages.驗收)
比Stages.驗收.ToString()
更好, 除了程式碼更簡潔,nameof() 可用在限定靜態常數(Static Constant)的場合,應用範圍更廣。
假設有一堆程式碼原本寫成Stages.XXXX.ToString()
,我想要全部換成nameof(Stages.XXX)
,例如以下的程式碼:
public enum Stages
{
提案,
審核,
執行,
驗收,
結案
}
public class Test
{
public void Process(string stage, int code)
{
if (stage == Stages.提案.ToString())
{
//Blah blah
}
else if (stage == Stages.審核.ToString() && code == 5)
{
//Walah Walh
}
else if (stage == Stages.執行.ToString() && code > 0)
{
//Blu blu
}
}
}
因為 XXX 有多個列舉選項,要用 Visual Studio 的尋找取代功能一次換掉得花點腦筋。這種需求,老鳥們都知道用 Regular Expression 最快。 而 Visual Studio 身為地表最強的開發工具,當然也有想到這點。
有些人可能不知道,Visual Studio 從 2015 開始,「尋找與取代文字」功能就支援 Regular Expression。 尋找取代對話框下方有個點加星號的圖示,啟用後可輸入正則表達式,在我們的案例可以寫成Stages\.(.+?)\.ToString\(\)
(不支援具名群組,語法較接近JavaScript RegExp),最好用的地方是表中的(.+?)
會幫我們取出 Stages.XXXX.ToString() 裡的 XXXX, 以 $1 符號穿插在取代結果中,寫成nameof(Stages.$1)
,產生我們要求的結果。示範如下:
學會這個小技巧,將來遇到複雜的取代作業,別再傻傻尋找後手工改,花點時間寫個正則表達示,享受一彈指就完成的快感吧~
Tips of using Visual Studio find and replace with regular expression to complete complex replace jobs.
Comments
# by Eason
站長您好,請問在文章當中的表示式,有一個問號 "(.+?)" Stages\.(.+?)\.ToString\(\) 但是在動態示範的.gif圖裡面,是沒有問號的, 查詢了一下,應該使用您.gif裡面的(.+) 就可以判斷? 感謝站長分享文章 :)
# by Jeffrey
to Eason, 加不加問號的差別只發生在遇到 Stages.XXXX.ToString().ToString() 時,(.+?) 的 $1 = Stages.XXXX,而 (.+) 的 $1 則是 Stages.XXXX.ToString(),嚴格來說加問號更保險,但實務上不太會有 ToString().ToString() 這種寫法,以範例程式而言不用加也很 OK。謝謝你的回饋。
# by Litfal
難點在於寫好正則XD 我每次寫都要踹一兩下 不過還是很爽
# by ByTIM
剛用來取代Format的字串,不錯用,只是 \ 好像不用特別打,用 {(.+?)}; 取代成 空字串 原本 "XXX:AAA名稱:{dv.brandName};" 取代後 "XXX:AAA名稱:" 請問下, \ 需要的時機是?
# by Jeffrey
to ByTIM, \. 相當於 [.] 用來比對點符號,若沒有 \ 輸入.代表任何字元都可以。例如:"StageX"吻合"Stage."但不符合"Stage\."。
# by ByTIM
To Jeffrey: 好的,我再多多研究看看!感謝您的回答。
# by Jack
能這樣使用取代真的很棒,學到一招了 感謝大大~
# by GXiang
VSCode 也有類似用法~ Ctrl + F 選取 「大小寫須相符」跟「使用規則運算式」 再選取你要尋找的文字再按一次 Ctrl + F,VSCode 就自動幫你完成正則尋找了