分享 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 就自動幫你完成正則尋找了

Post a comment