在 Visual Studio 中使用規則運算式
Visual Studio 會使用 .NET 規則運算式來尋找和取代文字。
規則運算式語法
下表包含一些規則運算式字元、運算子、建構及模式的範例。 如需更完整的參考,請參閱規則運算式語言。
目標 | 運算式 | 範例 |
---|---|---|
比對任何單一字元 (分行符號除外)。 如需詳細資訊,請參閱任何字元。 | . | a.o 會比對 "around" 中的 "aro" 和 "about" 中的 "abo",但不比對 "across" 中的 "acro" |
比對先前運算式中零個或多個項目 (比對的字元越多越好)。 如需詳細資訊,請參閱比對零或多次。 | * | a*r 會比對 "rack" 中的 "r"、"ark" 中的 "ar",以及 "aardvark" 中的 "aar" |
比對任何字元零或多次。 | .* | c.*e 會比對 "racket" 中的 "cke"、"comment" 中的 "comme",以及 "code" 中的 "code" |
比對先前運算式中一個或多個項目 (比對的字元越多越好)。 如需詳細資訊,請參閱比對一或多次。 | + | e+d 會比對 "feeder" 中的 "eed" 和 "faded" 中的 "ed" |
一或多次比對任何字元。 | .+ | e.+e 會比對 "feeder" 中的 "eede",但在 "feed" 中找不到相符項目 |
比對先前運算式中零個或多個項目 (比對的字元越少越好)。 如需詳細資訊,請參閱比對零或多次 (Lazy (忽略優先) 比對)。 | *? | \w*?d 會比對 "faded" 中的 "fad" 和 "ed",但不會因為延遲相符而比對 "faded" 整個字 |
比對先前運算式中一個或多個項目 (比對的字元越少越好)。 如需詳細資訊,請參閱比對一或多次 (Lazy (忽略優先) 比對)。 | +? | e\w+? 會比對 "asleep" 中的 "ee" 和 "faded" 中的 "ed",但在 "fade" 中找不到相符項目 |
將比對字串錨定至行首或字串開頭 | ^ | ^car 只會比對出現在行首的 "car" 這個字 |
將比對字串錨定至行尾 | \r?$ | car\r?$ 只會比對出現在行尾的 "car" |
將比對字串錨定至檔案結尾 | $ | car$ 只會比對出現在檔案結尾的 "car" |
比對集合中的任何單一字元 | [abc] | b[abc] 會比對 "ba"、"bb" 和 "bc" |
比對字元範圍之間的任何字元 | [a-f] | be[n-t] 會比對 "between" 中的 "bet"、"beneath" 中的 "ben" 和 "beside" 中的 "bes",但在 "below" 中找不到相符項目 |
擷取和隱含編號包含在括號內的運算式 | () | ([a-z])X\1 會比對 "aXa" 和 "bXb",但不比對 "aXb"。 "\1" 表示第一個運算式群組 "[a-z]"。 如需詳細資訊,請參閱擷取群組和取代模式。 |
使比對失效 | (?!abc) | real(?!ity) 會比對 "realty" 和 "really" 中的 "real",但不比對 "reality" 中的 "real"。它也會在 "realityreal" 中找到第二個 "real" (但不是第一個 "real")。 |
比對任何不在一組特定字元中的字元。 如需詳細資訊,請參閱負字元群組。 | [^abc] | be[^n-t] 會比對 "before" 中的 "bef"、"behind" 中的 "beh" 和 "below" 中的 "bel",但在 "beneath" 中找不到相符項目 |
比對符號之前或之後的運算式 | | | (sponge|mud) bath 會比對 "sponge bath" 和 "mud bath" |
逸出反斜線之後的字元 | \ | \^ 會比對 ^ 字元 |
指定前置字元或群組的出現次數。 如需詳細資訊,請參閱比對 n 次。 | {n},其中 'n' 是發生次數 | x(ab){2}x 會比對 "xababx"x(ab){2,3}x 會比對 "xababx" 和 "xabababx",但不比對 "xababababx" |
比對 Unicode 類別中的文字。 如需 Unicode 字元類別的詳細資訊,請參閱 Unicode Standard 15.0 字元屬性。 | \p{X},其中 "X" 是 Unicode 數字。 | \p{Lu} 會比對 "Thomas Doe" 中的 "T" 和 "D" |
比對字邊界 | \b (在字元類別之外 \b 會指定字邊界,在字元類別 \b 內則會指定退格鍵。) |
\bin 會比對 "inside" 中的 "in",但在 "pinto" 中找不到相符項目 |
比對分行符號 (即歸位字元後面接著新行,或僅新行) | \r?\n | End\r?\nBegin 只在 "End" 是一行的最後一個字串,且 "Begin" 是下一行的第一個字串時比對 "End" 和 "Begin" |
比對任何文字字元 | \w | a\wd 會比對 "add" 和 "a1d",但不比對 "a d" |
比對任何空白字元 | \s | Public\sInterface 會比對 "Public Interface" 這個片語 |
比對任何十進位數字字元 | \d | \d 會比對 "wd40" 中的 "4" 和 "0" |
結合一些用以比對十六進位數字之運算子和建構的規則運算式範例是 \b0[xX]([0-9a-fA-F]+)\b
。 此運算式會比對 "0xc67f",但不比對 "0xc67g"。
提示
在 Windows 作業系統中,大部分的程式行都是以 "\r\n" 結尾 (歸位字元後面接著新行)。 這些字元並不可見,但是會顯示在編輯器中,並傳遞至 .NET 規則運算式服務。 當您處理來自 Web 或非 Windows 作業系統的檔案時,請務必考慮到它們可能僅使用新行做為分行符號。
擷取群組和取代模式
擷取群組會描寫規則運算式的子運算式,以及擷取輸入字串的子字串。 您可以使用規則運算式本身內部 (例如,尋找重複的字詞),或取代模式中擷取的群組。 如需詳細資訊,請參閱規則運算式中的群組建構。
若要建立編號的擷取群組,請用規則運算式模式中的括弧括住子運算式。 擷取會依據規則運算式中的左括號的位置,由左至右自動編號。 若要存取擷取的群組,請考慮下列範例:
在規則運算式內:使用
\number
。 例如,規則運算式(\w+)\s\1
中的\1
參考第一個擷取群組(\w+)
。在取代模式中:使用
$number
。 例如,已分組的規則運算式(\d)([a-z])
會定義兩個群組:第一個群組包含單一的十進位數字,第二個群組包含介於 a 和 z 之間的單一字元。 運算式在下列字串中找到四個相符項目:1a 2b 3c 4d。 取代字串z$1
只參考第一個群組 ($1
),並將字串轉換成 z1 z2 z3 z4。
下圖顯示規則運算式 (\w+)\s\1
和取代字串 $1
。 規則運算式和取代模式會參考自動編號為 1 的第一個擷取群組。 當您在 Visual Studio 的 [快速取代] 對話方塊中選擇 [全部取代] 時,會將重複的字組從文字中移除。
提示
在 [快速取代] 對話方塊中,務必選取 [使用規則運算式] 按鈕,或按 Alt+E。
具名的擷取群組
您可以改為為擷取群組命名,不使用自動編號。 具的擷取群組的語法為 (?<name>subexpression)
。
具名擷取群組 (例如編號的擷取群組),可在規則運算式本身或在取代模式中使用。 若要存取具名擷取群組,請考慮下列範例:
在規則運算式內:使用
\k<name>
。 例如,規則運算式(?<repeated>\w+)\s\k<repeated>
中的\k<repeated>
參考名稱為repeated
且子運算式為\w+
的擷取群組。在取代模式中:使用
${name}
。 例如:${repeated}
。
下圖顯示規則運算式 (?<repeated>\w+)\s\k<repeated>
和取代字串 ${repeated}
。 規則運算式和取代模式會參考名為 repeated
的擷取群組。 當您在 Visual Studio 的 [快速取代] 對話方塊中選擇 [全部取代] 時,會將重複的字組從文字中移除。
提示
務必選取 [快速取代] 對話方塊中的 [使用規則運算式] 按鈕 (或按 Alt+E)。
如需具名擷取群組的詳細資訊,請參閱具名的相符子運算式。 如需取代模式中所用規則運算式的詳細資訊,請參閱規則運算式中的替代項目。
範例
模式 | 描述 |
---|---|
int ([_A-Za-z][_A-Za-z0-9]*) |
比對單一整數定義。 識別碼以一個大寫或小寫字母開頭,後面跟著零個或多個 (用 * 表示) 字母或數字。 識別碼會以外部括弧擷取做為 $1 。 |
(private|internal|public)*\s*([\w]+\s+)int\s+([_A-Za-z][_A-Za-z0-9]*)\s+=\s+[+-]+(\d)+ |
比對初始化為整數常值、擷取各種部分的 C# 整數宣告,包括存取層級、修飾詞 (如 const 或 static )、識別碼和定義的值。 注意使用 \s+ 表示至少一個空白字元,或使用 \s* 表示空白字元可能出現也可能不出現。 |
foreach\s*\(([\w\d]*)\s+([\w\d]*)\s+in\s+(.*)\) |
比對 foreach 迴圈的開頭行。 常值括弧會使用出反斜線 (\ ) 逸出。 各種群組會以未逸出的括弧擷取做為 $1 、$2 和 $3 。 |
#define\s+([_A-Za-z][_A-Za-z0-9]*) |
比對 #define 定義 (如果有值,則不包含值)。 定義的權杖儲存在 $1 中。 |
#include\s+["<](.*)[">] |
比對 C++ 來源檔案中的 include。 |