使用英语阅读

通过


在 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”中的“eed”,但在“feed”中未找到匹配项
零次或多次匹配前面的表达式(匹配尽可能少的字符)。 有关详细信息,请参阅零次或多次匹配(惰性匹配) *? 由于是惰性匹配,\w*?d 匹配“faded”中的“fad”和“ed”而不是“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”(但不匹配“reality”)中的“real”。它还能找到“realityreal”中的第二个“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]) 定义两个组:第一个组包含一个小数位数,第二个组包含 z之间的单个字符。 表达式在以下字符串中查找四个匹配项:1a 2b 3c 4d。 替换字符串 z$1 仅引用第一组($1),并将字符串转换为 z1 z2 z3 z4

下图显示了正则表达式 (\w+)\s\1 和替换字符串 $1。 正则表达式和替换模式都引用自动编号为 1 的第一个捕获组。 在 Visual Studio 的“快速替换”对话框中选择“替换所有 时,将从文本中删除重复的单词。

屏幕截图显示了“快速替换”,其中显示的是 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 的“快速替换”对话框中选择“替换所有 时,将从文本中删除重复的单词。

屏幕截图显示了“快速替换”,其中显示的是 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# 整数声明,捕获各种部分,包括访问级别、修饰符(如 conststatic、标识符和定义的值)。 请注意,使用 \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++ 源文件中匹配包含项。