正则表达式语法
下表包含一些正则表达式字符、运算符、构造和模式示例。
目标 | 表达式 | 示例 |
---|---|---|
与任何单个字符匹配(换行符除外)。 | 。 | 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”是出现次数 | x(ab){2}x 匹配“xababx”x(ab){2,3}x 匹配“xababx”和“xabababx”,但不匹配“xababababx” |
匹配 Unicode 类别中的文本 | \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 匹配词组“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++ 源文件中。 |