在 Visual Studio 中使用正規表示式
Visual Studio 會使用 .NET 正則表示式 來尋找和取代文字。
正則表達式語法
下表包含一些正則表達式字元、運算元、建構和模式範例。 如需更完整的參考,請參閱 正規表示式語言。
目的 | 表達 | 例 |
---|---|---|
比對任何單一字元(不包括換行符)。 如需詳細資訊,請參閱 任何字元。 | . |
a.o 會比對 “around” 中的 “aro”和 “about” 中的 “abo”,但不會符合 “across” 中的 “acro” |
比對前一個表達式出現的零次或多次(比對出現的字元數越多越好)。 如需更多資訊,請參閱 匹配零次或多次。 | * |
a*r 對應於“rack”中的“r”、“ark”中的“ar”,以及“aardvark”中的“aar” |
匹配(或比對)任意字符零次或多次。 | .* |
c.*e 匹配 "racket" 和 "comme" 中的 "cke",以及 "code" 中的 "code" |
比對前面的表達式的一次或多次出現(盡可能比對最多的字元)。 如需詳細資訊,請參閱 匹配一或多次。 | + |
e+d 符合 “feeder” 中的 “eed” 和 “faded” 中的 “ed” |
匹配任意字元一次或多次。 | .+ |
e.+e 在「feeder」中匹配「eede」,但在「feed」中找不到匹配。 |
比對前面表達式的零次或多次出現(盡可能少地比對字元)。 如需詳細資訊,請參閱 比對零次或多次 (延遲比對)。 | *? |
\w*?d 比對 「fad」 和 「ed」 在 「faded」 中, 但不是整個字 「faded」 ,因為延遲比對 |
比對前述表達式的一次或多次出現(盡可能匹配最少的字元)。 如需詳細資訊,請參閱 比對一或多次 (延遲比對)。 | +? |
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"。它還會找到 "realityreal" 中的第二個 "real"(而不是第一個 "real")。 |
比對不屬於指定字元集合的任何字元。 如需詳細資訊,請參閱 負字元群組。 | [^abc] |
be[^n-t] 符合 “before” 中的 “bef”、“behind” 中的 “beh”,以及 “below” 中的 “bel”,但在 “beneath” 中找不到相符專案。 |
比對符號之前或之後的表達式 | | |
(sponge|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” 是行的最後一個字符串,而 “Begin” 是下一行的第一個字符串時,End\r?\nBegin 才會比對 “End” 和 “Begin” |
比對任何 單字字符 | \w |
a\wd 符合 “add” 和 “a1d”,但不符合 “a d” |
比對任何 空格符 | \s |
Public\sInterface 符合「公用介面」詞組 |
比對任何 十進位字元 | \d |
\d 對應於字符串 “wd40” 中的 “4” 和 “0” |
結合某些運算子和建構以符合十六進位數位的範例正則表示式 \b0[xX]([0-9a-fA-F]+)\b
。 此表達式符合 「0xc67f」,但不符合 「0xc67g」。。
提示
在 Windows 作業系統中,大部分行結尾為 「\r\n」 (歸位字元後面接著新行)。 這些字元不可見,但會出現在編輯器中,並傳遞至 .NET 正則表示式服務。 當您處理來自網路或非 Windows 操作系統的檔案時,請務必考慮它們可能只使用新行來換行。
擷取群組和取代模式
擷取群組會描述正則表達式的子表達式,並擷取輸入字串的子字串。 您可以在正則表示式本身內使用擷取的群組(例如尋找重複的單字),或在取代模式中使用。 如需詳細資訊,請參閱正規表示式中的 群組建構。
若要建立編號的擷取群組,請在正則表達式模式中以括弧括住子表達式。 擷取會根據正則表達式中左括弧的位置自動從左至右編號。 若要存取擷取的群組,請考慮下列範例:
正規表示式內:使用
\number
。 例如,正規表示式中的\1
(\w+)\s\1
參考第一個擷取群組(\w+)
。在取代模式中:使用
$number
。 例如,群組正則表達式(\d)([a-z])
定義兩個群組:第一個群組包含單一十進位數,而第二個群組包含 與 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>
。 例如,正則表達式中的\k<repeated>
(?<repeated>\w+)\s\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++原始程序檔中。 |