天天看點

Visual Studio 使用正規表達式查找替換

這幾天在寫DirectSound錄音時,發現按照文檔和查閱的資料寫出的代碼,在建立錄音緩存時總是報無效的參數這個錯誤。我在想是不是因為音頻格式未設定正确造成的,于是決定運作directx9的例子來看看究竟是什麼情況。

但編譯時卻發現,在win10下的dx9例子中有很多符号都未定義,例如DXTRACE_ERR_MSGBOX,而我又懶得修正這個錯誤,于是決定先注釋掉它,反正我隻想看看運作到建立錄音緩存的那部分代碼是如何運作的。結果一編譯,發現這樣的地方有好幾十處,我想一個個去注釋太麻煩了,就決定用正規表達式搜尋替換。由于之前沒怎麼接觸這個,最後搗鼓了好久終于弄清楚了,記下來以備後查。

先引用一個關于VS正規表達式的部落格文章(部落客zelin):

正規表達式(Visual Studio)

當然,英文好的直接看MSDN即可,完全沒有基礎的,可以先看看這些資料了解一下。

我的任務是将所有

return DXTRACE_XXX( TEXT("XXX"), hr );
           

的代碼注釋掉,替換為

// return DXTRACE_XXX( TEXT("XXX"), hr );
return hr;
           

大家可以看到,我要替換的字元串還是有格式的,以 “return DXTRAE” 開頭,以 “;” (分号)結尾,中間的字元串是變化的,也就是這是一個有着固定頭尾的字元串,我先把正規表達式寫出來,然後分析。

查找内容:

{(return DXTRACE)(.)*(;)}
           

替換為:

\/\/\1\nreturn hr;
           

先說查找内容,其中,用到了 小括号() ,大括号{} ,點号.,星号*

小括号,用于将表達式分塊,例子中,我分了3塊:

1,return DXTRACE

2,.

3,;

其中第一塊和第三塊,即待搜尋的字元串中固定的部分,而第二塊是點,按MSDN文檔說明,這個點比對除分行符(line break)外的任意字元,點後面的符号星号(*),則比對前一個表達式塊零次或多次,也就是比對前面的第2塊表達式零次或多次,是以說,我需要分塊,如果不分的話,就會比對星号前面所有的字元串。

最後一個表達式塊,由于不在星号比對範圍内,而且又是最後一個塊,那麼小括号可以省略。

大括号的用處是标記符,主要用于在替換時使用,按照我寫的例子,我将比對出來的字元串做個标記,然後在替換時以 \1 的方式引用。

不清楚的話我再舉個例子:

{a}{b}{c}
           

這個例子,将比對例如 abcxyz 的字元串,那麼我在替換時,可以用 \1 引用 a,\2 引用 b,\3 引用 c ,依此類推。

這有什麼用呢?假設你想替換的字元串中,有需要保留的部分,那麼這個就很有用了。

最後,替換部分的例子,想必大家自己應該可以看明白了,唯一要提的就是,一些特殊符号需要用到轉義符: \

好了,關于VS的正規表達式還有很多文法沒有提到,不過我想大家應該可以自己慢慢摸索了,這個用好了,那麼再在VS中查找替換,就友善多了。

繼續閱讀