1 运算符
“表达式”属性支持以下正则表达式运算符:
表达式 |
说明 |
. |
指示任何字符。 |
\ |
指示后面的字符应按原义而不是作为特殊字符进行解释。例如,\. 指示“.”。 |
() |
将括号内的运算符分组。 |
{n} |
生成前面项的 n 个实例。例如,a{2} 生成“aa”。 |
{n,m} |
生成前面项的至少 n 个实例但不超过 m 个实例。例如,a{2,4} 生成“aa”、“aaa”或“aaaa”。 |
{n,} |
生成前面项的 n 个或更多实例。例如,a{2,} 生成“aa”、“aaa”、“aaaa”、“aaaaa”等。 |
* |
生成前面项的 0 个或多个实例。 |
+ |
生成前面项的 1 个或多个实例。 |
? |
生成前面项的 0 个或 1 个实例。 |
| |
在 | 字符任一侧生成项。 |
[aeiou] |
生成括号内的任何字符。 |
[a-z] |
生成字符指定范围内的任何字符。 |
[^aeiou] |
生成除括号内字符以外的任何字符。 |
2 数量限定符
限定符将可选数量的数据添加到正则表达式。限定符表达式应用于紧挨着它前面的字符、组或字符类。.NET Framework 正则表达式支持最小匹配 (lazy) 限定符。
下表描述了影响匹配的元字符。数量 n 和 m 是整数常数。
限定符 |
说明 |
* |
指定零个或更多个匹配;例如 \w* 或 (abc)*。等效于 {0,}。 |
+ |
指定一个或多个匹配;例如 \w+ 或 (abc)+。等效于 {1,}。 |
? |
指定零个或一个匹配;例如 \w? 或 (abc)?。等效于 {0,1}。 |
{ n } |
指定恰好 n 个匹配;例如 (pizza){2}。 |
{ n ,} |
指定至少 n 个匹配;例如 (abc){2,}。 |
{ n , m } |
指定至少 n 个但不多于 m 个匹配。 |
*? |
指定尽可能少地使用重复的第一个匹配(等效于 lazy *)。 |
+? |
指定尽可能少地使用重复但至少使用一次(等效于 lazy +)。 |
?? |
指定使用零次重复(如有可能)或一次重复 (lazy ?)。 |
{ n }? |
等效于 {n} (lazy {n})。 |
{ n ,}? |
指定尽可能少地使用重复但至少使用 n 次 (lazy {n,})。 |
{ n , m }? |
指定介于 n 次和 m 次之间、尽可能少地使用重复 (lazy {n,m})。 |
3 字符转义
下表中列出的字符转义在正则表达式和替换模式中都会被识别。
转义符 |
说明 |
一般字符 |
除 . $ ^ { [ ( | ) * + ? \ 外,其他字符与自身匹配。 |
\a |
与响铃(警报)\u0007 匹配。 |
\b |
如果在 [] 字符类中,则与退格符 \u0008 匹配;如果不是这种情况,请参见本表后面的“注意”部分。 |
\t |
与 Tab 符 \u0009 匹配。 |
\r |
与回车符 \u000D 匹配。 |
\v |
与垂直 Tab 符 \u000B 匹配。 |
\f |
与换页符 \u000C 匹配。 |
\n |
与换行符 \u000A 匹配。 |
\e |
与 Esc 符 \u001B 匹配。 |
\040 |
将 ASCII 字符匹配为八进制数(最多三位);如果没有前导零的数字只有一位数或者与捕获组号相对应,则该数字为后向引用。(有关更多信息,请参见反向引用。) 例如,字符 \040 表示空格。 |
\x20 |
使用十六进制表示形式(恰好两位)与 ASCII 字符匹配。 |
\cC |
与 ASCII 控制字符匹配;例如,\cC 为 Ctrl-C。 |
\u0020 |
使用十六进制表示形式(恰好四位)与 Unicode 字符匹配。 注意:.NET Framework 不支持用于指定 Unicode 的 Perl 5 字符转义。Perl 5 字符转义的格式是 \x{####¡},其中“####¡”是十六进制数字的序列。应改为使用本行中描述的 .NET Framework 字符转义。 |
\ |
在后面带有不识别为转义符的字符时,与该字符匹配。例如,\* 与 \x2A 相同。 |
注意: |
转义字符 \b 是一个特例。在正则表达式中,\b 表示单词边界(在 \w 和 \W 之间),不过,在 [] 字符类中,\b 表示退格符。在替换模式中,\b 始终表示退格符。 |
4 原子零宽度断言
下表中描述的元字符不会使引擎在字符串中前进或使用字符。它们只是根据字符串中的当前位置使匹配成功或失败。例如,^ 指定当前位置在行或字符串的开头。因此,正则表达式 ^FTP 只会返回那些在行的开头出现的字符串“FTP”的匹配项。
断言 |
说明 |
^ |
指定匹配必须出现在字符串的开头或行的开头。有关更多信息,请参见正则表达式选项中的 Multiline 选项。 |
$ |
指定匹配必须出现在以下位置:字符串结尾、字符串结尾处的 \n 之前或行的结尾。有关更多信息,请参见正则表达式选项中的 Multiline 选项。 |
\A |
指定匹配必须出现在字符串的开头(忽略 Multiline 选项)。 |
\Z |
指定匹配必须出现在字符串的结尾或字符串结尾处的 \n 之前(忽略 Multiline 选项)。 |
\z |
指定匹配必须出现在字符串的结尾(忽略 Multiline 选项)。 |
\G |
指定匹配必须出现在上一个匹配结束的地方。与 Match.NextMatch() 一起使用时,此断言确保所有匹配都是连续的。 |
\b |
指定匹配必须出现在 \w(字母数字)和 \W(非字母数字)字符之间的边界上。匹配必须出现在单词边界上(即出现在由任何非字母数字字符分隔的单词中第一个或最后一个字符上)。匹配也可以出现在字符串结尾处的单词边界上。 |
\B |
指定匹配不得出现在 \b 边界上。 |
5 字符类
字符类表示一组可以匹配输入字符串的字符。组合原义字符、转义符和字符类以构成正则表达式模式。
字符类将定义字符集。一些字符类等同于一个或多个 Unicode 通用类别值或 Unicode 块。Unicode 通用类别定义了字符的主要分类,即字符的类型是否为字母、十进制数字、分隔符、数学符号、标点符号,等等。例如,Lu 通用类别表示“字母,小写”,Sm 类别表示“符号,数学”。有关更多信息,请参见支持的 Unicode 通用类别。
Unicode 块是 Unicode 码位的命名范围。.NET Framework 提供一组从 Unicode 块名称派生的命名块。例如,.NET Framework 提供 IsBasicLatin 命名块,其对应于 Basic Latin Unicode 块并且包含 U+0000 至 U+007F 范围内的字符。有关更多信息,请参见支持的命名块。
.NET Framework 支持字符类减法表达式,通过该表达式可以定义一组字符作为从一个字符类中排除另一字符类的结果。有关更多信息,请参见字符类。
字符类语法
下表总结了字符类及其语法。
字符类 |
说明 |
[ 字符分组 ] |
(正字符分组。) 匹配指定字符分组内的任何字符。 字符分组由串连的一个或多个原义字符、转义符、字符范围或字符类组成。 例如,若要指定所有元音字母,使用 [aeiou]. 若要指定所有标点符号和十进制数字符,使用代码 [\p{P}\d]。 |
[^ 字符分组 ] |
(负字符分组。) 匹配不在指定字符分组内的任何字符。 字符分组由串连的一个或多个原义字符、转义符、字符范围或字符类组成。前导符 (^) 是强制的,指示字符分组为负字符分组,而不是正字符分组。 例如,若要指定除元音字母以外的所有字符,使用 [^aeiou]. 若要指定除标点符号和十进制数字符以外的所有字符,使用 [^\p{P}\d]。 |
[ 第一个字符 - 最后一个字符 ] |
(字符范围。) 匹配字符范围中的任何字符。 字符范围是一系列连续的字符,定义的方法是:指定系列中的第一个字符,连字符 (-),然后指定系列中的最后一个字符。如果两个字符具有相邻的 Unicode 码位,则这两个字符是连续的。可以串连两个或更多字符范围。 例如,若要指定从“0”至“9”的十进制数范围、从“a”至“f”的小写字母范围,以及从“A”至“F”的大写字母范围,使用 [0-9a-fA-F]。 |
. |
(句点字符。) 匹配除 \n 以外的任何字符。如果已用 Singleline 选项做过修改,则句点字符可与任何字符匹配。有关更多信息,请参见正则表达式选项。 请注意,正字符分组或负字符分组中的句点字符(方括号内的句点)将被视为原义句点字符,而非字符类。 |
\p{ 名称 } |
匹配通过名称(例如 Ll、Nd、Z、IsGreek 和 IsBoxDrawing)指定的 Unicode 通用类别或命名块中的任何字符。 |
\P{ 名称 } |
匹配不在名称中指定的 Unicode 通用类别或命名块中的任何字符。 |
\w |
与任何单词字符匹配。等效于 Unicode 通用类别 [\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}\p{Lm}]。如果通过 ECMAScript 选项指定了符合 ECMAScript 的行为,则 \w 等效于 [a-zA-Z_0-9]。 |
\W |
与任何非单词字符匹配。等效于 Unicode 通用类别 [^\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}\p{Lm}]。如果通过 ECMAScript 选项指定了符合 ECMAScript 的行为,则 \W 等效于 [^a-zA-Z_0-9]。 |
\s |
与任何空白字符匹配。等效于转义符和 Unicode 通用类别 [\f\n\r\t\v\x85\p{Z}]。如果通过 ECMAScript 选项指定了符合 ECMAScript 的行为,则 \s 等效于 [ \f\n\r\t\v]。 |
\S |
与任何非空白字符匹配。等效于转义符和 Unicode 通用类别 [^\f\n\r\t\v\x85\p{Z}]。如果通过 ECMAScript 选项指定了符合 ECMAScript 的行为,则 \S 等效于 [^ \f\n\r\t\v]。 |
\d |
与任何十进制数字匹配。对于 Unicode 类别的 ECMAScript 行为,等效于 \p{Nd},对于非 Unicode 类别的 ECMAScript 行为,等效于 [0-9]。 |
\D |
与任何非数字字符匹配。对于 Unicode 类别的 ECMAScript 行为,等效于 \P{Nd},对于非 Unicode 类别的 ECMAScript 行为,等效于 [^0-9] 。 |
支持的 Unicode 通用类别
Unicode 定义了下表列出的通用类别和说明。有关更多信息,请参见 Unicode Character Database(Unicode 字符数据库)处的“UCD File Format”(UCD 文件格式)和“General Category Values”(通用类别值)次主题。
类别 |
说明 |
Lu |
字母,大写 |
Ll |
字母,小写 |
Lt |
字母,词首字母大写 |
Lm |
字母,修饰符 |
Lo |
字母,其他 |
Mn |
标记,非间距 |
Mc |
标记,间距组合 |
Me |
标记,封闭 |
Nd |
数字,十进制数 |
Nl |
数字,字母 |
No |
数字,其他 |
Pc |
标点,连接符 |
Pd |
标点,短划线 |
Ps |
标点,开始 |
Pe |
标点,结束 |
Pi |
标点,前引号(根据用途可能表现为类似 Ps 或 Pe) |
Pf |
标点,后引号(根据用途可能表现为类似 Ps 或 Pe) |
Po |
标点,其他 |
Sm |
符号,数学 |
Sc |
符号,货币 |
Sk |
符号,修饰符 |
So |
符号,其他 |
Zs |
分隔符,空白 |
Zl |
分隔符,行 |
Zp |
分隔符,段落 |
Cc |
其他,控制 |
Cf |
其他,格式 |
Cs |
其他,代理项 |
Co |
其他,私用 |
Cn |
其他,未赋值(不存在任何字符具有此属性) |
.NET Framework 提供其他类别,用于表示一组 Unicode 字符类别,如下表所示。
类别 |
表示 |
C |
(所有控制字符)Cc、Cf、Cs、Co 和 Cn。 |
L |
(所有字母)Lu、Ll、Lt、Lm 和 Lo。 |
M |
(所有附加符号标记)Mn、Mc 和 Me。 |
N |
(所有数字)Nd、Nl 和 No。 |
P |
(所有标点)Pc、Pd、Ps、Pe、Pi、Pf 和 Po。 |
S |
(所有符号)Sm、Sc、Sk 和 So。 |
Z |
(所有分隔符)Zs、Zl 和 Zp。 |
支持的命名块
.NET Framework 提供下表列出的命名块。该组支持的命名块基于 Unicode 4.0 和 Perl 5.6。
码位范围 |
块名称 |
0000 - 007F |
IsBasicLatin |
0080 - 00FF |
IsLatin-1Supplement |
0100 - 017F |
IsLatinExtended-A |
0180 - 024F |
IsLatinExtended-B |
0250 - 02AF |
IsIPAExtensions |
02B0 - 02FF |
IsSpacingModifierLetters |
0300 - 036F |
IsCombiningDiacriticalMarks |
0370 - 03FF |
IsGreek - 或 - IsGreekandCoptic |
0400 - 04FF |
IsCyrillic |
0500 - 052F |
IsCyrillicSupplement |
0530 - 058F |
IsArmenian |
0590 - 05FF |
IsHebrew |
0600 - 06FF |
IsArabic |
0700 - 074F |
IsSyriac |
0780 - 07BF |
IsThaana |
0900 - 097F |
IsDevanagari |
0980 - 09FF |
IsBengali |
0A00 - 0A7F |
IsGurmukhi |
0A80 - 0AFF |
IsGujarati |
0B00 - 0B7F |
IsOriya |
0B80 - 0BFF |
IsTamil |
0C00 - 0C7F |
IsTelugu |
0C80 - 0CFF |
IsKannada |
0D00 - 0D7F |
IsMalayalam |
0D80 - 0DFF |
IsSinhala |
0E00 - 0E7F |
IsThai |
0E80 - 0EFF |
IsLao |
0F00 - 0FFF |
IsTibetan |
1000 - 109F |
IsMyanmar |
10A0 - 10FF |
IsGeorgian |
1100 - 11FF |
IsHangulJamo |
1200 - 137F |
IsEthiopic |
13A0 - 13FF |
IsCherokee |
1400 - 167F |
IsUnifiedCanadianAboriginalSyllabics |
1680 - 169F |
IsOgham |
16A0 - 16FF |
IsRunic |
1700 - 171F |
IsTagalog |
1720 - 173F |
IsHanunoo |
1740 - 175F |
IsBuhid |
1760 - 177F |
IsTagbanwa |
1780 - 17FF |
IsKhmer |
1800 - 18AF |
IsMongolian |
1900 - 194F |
IsLimbu |
1950 - 197F |
IsTaiLe |
19E0 - 19FF |
IsKhmerSymbols |
1D00 - 1D7F |
IsPhoneticExtensions |
1E00 - 1EFF |
IsLatinExtendedAdditional |
1F00 - 1FFF |
IsGreekExtended |
2000 - 206F |
IsGeneralPunctuation |
2070 - 209F |
IsSuperscriptsandSubscripts |
20A0 - 20CF |
IsCurrencySymbols |
20D0 - 20FF |
IsCombiningDiacriticalMarksforSymbols - 或 - IsCombiningMarksforSymbols |
2100 - 214F |
IsLetterlikeSymbols |
2150 - 218F |
IsNumberForms |
2190 - 21FF |
IsArrows |
2200 - 22FF |
IsMathematicalOperators |
2300 - 23FF |
IsMiscellaneousTechnical |
2400 - 243F |
IsControlPictures |
2440 - 245F |
IsOpticalCharacterRecognition |
2460 - 24FF |
IsEnclosedAlphanumerics |
2500 - 257F |
IsBoxDrawing |
2580 - 259F |
IsBlockElements |
25A0 - 25FF |
IsGeometricShapes |
2600 - 26FF |
IsMiscellaneousSymbols |
2700 - 27BF |
IsDingbats |
27C0 - 27EF |
IsMiscellaneousMathematicalSymbols-A |
27F0 - 27FF |
IsSupplementalArrows-A |
2800 - 28FF |
IsBraillePatterns |
2900 - 297F |
IsSupplementalArrows-B |
2980 - 29FF |
IsMiscellaneousMathematicalSymbols-B |
2A00 - 2AFF |
IsSupplementalMathematicalOperators |
2B00 - 2BFF |
IsMiscellaneousSymbolsandArrows |
2E80 - 2EFF |
IsCJKRadicalsSupplement |
2F00 - 2FDF |
IsKangxiRadicals |
2FF0 - 2FFF |
IsIdeographicDescriptionCharacters |
3000 - 303F |
IsCJKSymbolsandPunctuation |
3040 - 309F |
IsHiragana |
30A0 - 30FF |
IsKatakana |
3100 - 312F |
IsBopomofo |
3130 - 318F |
IsHangulCompatibilityJamo |
3190 - 319F |
IsKanbun |
31A0 - 31BF |
IsBopomofoExtended |
31F0 - 31FF |
IsKatakanaPhoneticExtensions |
3200 - 32FF |
IsEnclosedCJKLettersandMonths |
3300 - 33FF |
IsCJKCompatibility |
3400 - 4DBF |
IsCJKUnifiedIdeographsExtensionA |
4DC0 - 4DFF |
IsYijingHexagramSymbols |
4E00 - 9FFF |
IsCJKUnifiedIdeographs |
A000 - A48F |
IsYiSyllables |
A490 - A4CF |
IsYiRadicals |
AC00 - D7AF |
IsHangulSyllables |
D800 - DB7F |
IsHighSurrogates |
DB80 - DBFF |
IsHighPrivateUseSurrogates |
DC00 - DFFF |
IsLowSurrogates |
E000 - F8FF |
IsPrivateUse |
F900 - FAFF |
IsPrivateUseArea |
FB00 - FB4F |
IsCJKCompatibilityIdeographs |
FB50 - FDFF |
IsAlphabeticPresentationForms |
FE00 - FE0F |
IsArabicPresentationForms-A |
FE20 - FE2F |
IsVariationSelectors |
FE30 - FE4F |
IsCombiningHalfMarks |
FE50 - FE6F |
IsCJKCompatibilityForms |
FE70 - FEFF |
IsSmallFormVariants |
FF00 - FFEF |
IsArabicPresentationForms-B |
FFF0 - FFFF |
IsHalfwidthandFullwidthForms |
字符类减法
一个字符类定义一组字符。字符类减法将产生一组字符,该组字符是从一个字符类中排除另一字符类中字符的结果。
字符类减法表达式具有以下形式:
[ 基本分组 -[ 排除分组 ]]
方括号 ([]) 和连字符 (-) 是强制的。base_group 是字符类语法表中所述的正字符分组或负字符分组。excluded_group 部分是另一个正字符分组或负字符分组,或者是另一个字符类减法表达式(即可以嵌套字符类减法表达式)。
例如,假设您有一个由从“a”至“z”范围内的字符组成的基本分组。若要定义除字符“m”之外的基本分组所组成的字符集,使用 [a-z-[m]]。若要定义除字符集“d”、“j”和“p”之外的基本分组所组成的字符集,使用 [a-z-[djp]]。若要定义除从“m”至“p”字符范围之外的基本分组所组成的字符集,使用 [a-z-[m-p]].
可考虑使用嵌套字符类减法表达式,[a-z-[d-w-[m-o]]]。该表达式由最里面的字符范围向外计算。首先,在从“d”至“w”的字符范围中减去从“m”至“o”的字符范围,产生从“d”至“l”和从“p”至“w”的字符集。然后在从“a”至“z”的字符范围中减去该集合,产生字符集 [abcmnoxyz]。
可以对任何字符类使用字符类减法。若要定义字符集,该字符集包括除空白字符 (\s)、标点通用类别中的字符 (\p{P})、IsGreek 命名块中的字符 (\p{IsGreek}) 以及 Unicode NEXT LINE 控制字符 (\x85) 之外的所有从 \u0000 至 \uFFFF 的 Unicode 字符,使用 [\u0000-\uFFFF-[\s\p{P}\p{IsGreek}\x85]]。
为字符类减法表达式选择将会产生有用结果的字符类。避免使用产生空字符集的表达式,这将无法匹配任何内容,同时避免使用等同于初始基本分组的表达式。例如,表达式 [\p{IsBasicLatin}-[\x00-\x7F]] 从 IsBasicLatin 通用类别中减去所有字符,其结果为空集合。类似地,表达式 [a-z-[0-9]] 的结果为初始基本分组。 这是因为基本分组是从“a”至“z”的字母组成的字符范围,排除分组为从“0”至“9”的十进制数组成的字符范围,基本分组不包含排除分组中的任何字符。
请注意,XML 架构正则表达式对字符类减法具有类似的支持。
6 正则表达式选项
可以使用影响匹配行为的选项修改正则表达式模式。可以通过下列两种基本方法之一设置正则表达式选项:可以在 Regex (pattern, options) 构造函数中的 options 参数中指定,其中 options 是 RegexOptions 枚举值的按位“或”组合;也可以使用内联 (?imnsx-imnsx:) 分组构造或 (?imnsx-imnsx) 其他构造在正则表达式模式内设置它们。
在内联选项构造中,一个选项或一组选项前面的减号 (-) 用于关闭这些选项。例如,内联构造 (?ix-ms) 将打开 IgnoreCase 和 IgnorePatternWhiteSpace 选项而关闭 Multiline 和 Singleline 选项。默认情况下,关闭所有正则表达式选项。
下表列出了 RegexOptions 枚举的成员以及等效的内联选项字符。请注意,选项 RightToLeft 和 Compiled 只适用于表达式整体而不允许内联。(它们只能在 Regex 构造函数的 options 参数中指定。) 选项 None 和 ECMAScript 不允许内联。
RegexOption 成员 |
内联字符 |
说明 |
None |
N/A |
指定不设置任何选项。 |
IgnoreCase |
i |
指定不区分大小写的匹配。 |
Multiline |
m |
指定多行模式。更改 ^ 和 $ 的含义,以使它们分别与任何行的开头和结尾匹配,而不只是与整个字符串的开头和结尾匹配。 |
ExplicitCapture |
n |
指定唯一有效的捕获是显式命名或编号的 (?<name>…) 形式的组。这允许圆括号充当非捕获组,从而避免了由 (?:…) 导致的语法上的笨拙。 |
Compiled |
N/A |
指定正则表达式将被编译为程序集。生成该正则表达式的 Microsoft 中间语言 (MSIL) 代码;以较长的启动时间为代价,得到更快的执行速度。 |
Singleline |
s |
指定单行模式。更改句点字符 (.) 的含义,以使它与每个字符(而不是除 \n 之外的所有字符)匹配。 |
IgnorePatternWhitespace |
x |
指定从模式中排除非转义空白并启用数字符号 (#) 后面的注释。(有关转义空白字符的列表,请参见字符转义。) 请注意,空白永远不会从字符类中消除。 |
RightToLeft |
N/A |
指定搜索是从右向左而不是从左向右进行的。具有此选项的正则表达式将移动到起始位置的左边而不是右边。(因此,起始位置应指定为字符串的结尾而不是开头。) 为了避免构造具有无限循环的正则表达式的可能性,此选项不能在中流指定。但是,(?<) 回顾后发构造提供了可用作子表达式的类似替代物。 RightToLeft 只更改搜索方向。它不会反转所搜索的子字符串。预测先行和回顾后发断言不改变:预测先行向右搜索;回顾后发向左搜索。 |
ECMAScript |
N/A |
指定已为表达式启用了符合 ECMAScript 的行为。此选项仅可与 IgnoreCase 和 Multiline 标志一起使用。将 ECMAScript 同任何其他标志一起使用将导致异常。 |
CultureInvariant |
N/A |
指定忽略语言中的区域性差异。有关更多信息,请参见在 RegularExpressions 命名空间中执行不区分区域性的操作。 |
7 替换
只在替换模式中允许替换。对于正则表达式中的类似功能,使用后向引用(如 \1)。有关后向引用的详细信息,请参见 反向引用 和后向引用构造。
字符转义和替换是在替换模式中识别的唯一的特殊构造。下面几部分描述的所有语法构造只允许出现在正则表达式中;替换模式中不识别它们。例如,替换模式 a*${txt}b 会插入字符串“a*”,该字符串后跟按 txt 捕获组匹配的子字符串,该子字符串后跟字符串“b”(如果有)。在替换模式中,* 字符不会识别为元字符。与此类似,在正则表达式匹配模式中不识别 $ 模式。在正则表达式中,$ 指定字符串的结尾。
下表显示如何定义命名并编号的替换模式。
字符 |
说明 |
$ 数字 |
替换按组号 number(十进制)匹配的最后一个子字符串。 |
${ name } |
替换由 (?<name> ) 组匹配的最后一个子字符串。 |
$$ |
替换单个“$”字符。 |
$& |
替换完全匹配本身的一个副本。 |
$` |
替换匹配前的输入字符串的所有文本。 |
$' |
替换匹配后的输入字符串的所有文本。 |
$+ |
替换最后捕获的组。 |
$_ |
替换整个输入字符串。 |
下表列出了用于修改正则表达式以允许进行二者之一/或匹配的特殊字符。
替换构造 |
定义 |
| |
与以 |(竖线)字符分隔的术语中的任何一项匹配;例如, cat|dog|tiger。使用最左侧的成功匹配。 |
(?( 表达式 )yes|no) |
如果表达式在此位置匹配,则与“yes”部分匹配;否则,与“no”部分匹配。“no”部分可省略。表达式可以是任何有效的子表达式,但它将变为零宽度断言,因此该语法等效于 (?(?=expression)yes|no)。请注意,如果表达式是命名组的名称或捕获组编号,则替换构造将解释为捕获测试(在本表的下一行对此进行了描述)。若要避免在这些情况下产生混淆,则可以显式拼出内部 (?=expression)。 |
(?( name )yes|no) |
如果命名捕获字符串有匹配,则与“yes”部分匹配;否则,与“no”部分匹配。“no”部分可省略。如果给定的名称不与此表达式中使用的捕获组的名称或编号对应,则替换构造将解释为表达式测试(在本表的上一行进行了描述)。 |
8 分组构造
分组构造描述了正则表达式的子表达式,通常用于捕获输入字符串的子字符串。下表描述了正则表达式分组构造。
分组构造 |
说明 |
( 子表达式 ) |
捕获匹配的子表达式(或非捕获组;有关更多信息,请参见正则表达式选项中的 ExplicitCapture 选项)。使用 () 的捕获基于左括号按顺序从 1 开始自动编号。捕获元素编号为零的第一个捕获是由整个正则表达式模式匹配的文本。 |
(?< name > 子表达式) |
将匹配的子表达式捕获到一个组名称或编号名称中。用于 name 的字符串不得包含任何标点符号,并且不能以数字开头。可以使用单引号替代尖括号,例如 (?'name')。 |
(?< name1 - name2 > 子表达式) |
(平衡组定义。) 删除先前定义的 name2 组的定义,并在 name1 组中存储先前定义的 name2 组和当前组之间的间隔。如果未定义 name2 组,则匹配将回溯。由于删除 name2 的最后一个定义会显示 name2 的先前定义,因此该构造允许将 name2 组的捕获堆栈用作计数器,用于跟踪嵌套构造(如括号)。在此构造中,name1 是可选的。可以使用单引号替代尖括号,例如 (?'name1-name2')。 有关更多信息,请参见本主题中的示例。 |
(?: 子表达式) |
(非捕获组。) 不捕获由子表达式匹配的子字符串。匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。 |
(?imnsx-imnsx: 子表达式) |
应用或禁用子表达式中指定的选项。例如,(?i-s: ) 将打开不区分大小写并禁用单行模式。有关更多信息,请参见正则表达式选项。 |
(?= 子表达式) |
(零宽度正预测先行断言。) 仅当子表达式在此位置的右侧匹配时才继续匹配。例如,\w+(?=\d) 与后跟数字的单词匹配,而不与该数字匹配。此构造不会回溯。 正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。 |
(?! 子表达式) |
(零宽度负预测先行断言。) 仅当子表达式不在此位置的右侧匹配时才继续匹配。例如,\b(?!un)\w+\b 与不以 un 开头的单词匹配。 负向预查,在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始 |
(?<= 子表达式) |
(零宽度正回顾后发断言。) 仅当子表达式在此位置的左侧匹配时才继续匹配。例如,(?<=19)99 与跟在 19 后面的 99 的实例匹配。此构造不会回溯。 |
(?<! 子表达式) |
(零宽度负回顾后发断言。) 仅当子表达式不在此位置的左侧匹配时才继续匹配。 |
(?> 子表达式) |
(非回溯子表达式(也称为“贪婪”子表达式)。) 该子表达式仅完全匹配一次,然后就不会逐段参与回溯了。(也就是说,该子表达式仅与可由该子表达式单独匹配的字符串匹配。) 默认情况下,如果匹配未成功,回溯会搜索其他可能的匹配。如果已知无法成功回溯,可以使用非回溯子表达式避免不必要的搜索,从而提高性能。 |
命名捕获基于左括号按从左到右的顺序依次编号(与非命名捕获类似),但在对所有非命名捕获进行计数之后才开始对命名捕获编号。例如,模式 ((?<One>abc)\d+)?(?<Two>xyz)(.*) 按编号和名称产生下列捕获组。(编号为 0 的第一个捕获总是指整个模式)。
编号 |
名称 |
模式 |
0 |
0(默认名称) |
((?<One>abc)\d+)?(?<Two>xyz)(.*) |
1 |
1(默认名称) |
((?<One>abc)\d+) |
2 |
2(默认名称) |
(.*) |
3 |
1 |
(?<One>abc) |
4 |
2 |
(?<Two>xyz) |
9 .NET Framework 正则表达式引擎概述
.NET Framework 正则表达式引擎是回溯的正则表达式匹配器,它并入了传统的非确定性有限自动机 (NFA) 引擎(例如 Perl、Python、Emacs 和 Tcl 使用的引擎)。这使其有别于更快的、但功能更有限的纯正则表达式确定性有限自动机 (DFA) 引擎,例如在 awk、egrep 或 lex 中提供的那些引擎。这也使其有别于标准化的、但较慢的 POSIX NFA。
三种正则表达式引擎类型
本节概述了三种引擎类型的优缺点,并解释了 .NET Framework 引擎为什么实现传统的 NFA 匹配器。
DFA 引擎在线性时状态下执行,因为它们不要求回溯(并因此它们永远不测试相同的字符两次)。DFA 引擎还可以确保匹配最长的可能的字符串。但是,因为 DFA 引擎只包含有限的状态,所以它不能匹配具有反向引用的模式;并且因为它不构造显示扩展,所以它不可以捕获子表达式。
传统的 NFA 引擎运行所谓的“贪婪的”匹配回溯算法,以指定顺序测试正则表达式的所有可能的扩展并接受第一个匹配项。因为传统的 NFA 构造正则表达式的特定扩展以获得成功的匹配,所以它可以捕获子表达式匹配和匹配的反向引用。但是,因为传统的 NFA 回溯,所以它可以访问完全相同的状态多次(如果通过不同的路径到达该状态)。因此,在最坏情况下,它的执行速度可能非常慢。因为传统的 NFA 接受它找到的第一个匹配,所以它还可能会导致其他(可能更长)匹配未被发现。
POSIX NFA 引擎与传统的 NFA 引擎类似,不同的一点在于:在它们可以确保已找到了可能的最长的匹配之前,它们将继续回溯。因此,POSIX NFA 引擎的速度慢于传统的 NFA 引擎;并且在使用 POSIX NFA 时,您恐怕不会愿意在更改回溯搜索的顺序的情况下来支持较短的匹配搜索,而非较长的匹配搜索。
程序员更为喜欢传统的 NFA 引擎的原因在于,NFA 引擎与 DFA 或 POSIX NFA 引擎相比更易于表达。尽管在最坏情况下 NFA 引擎的运行速度稍慢,但您可以通过使用降低多义性和限制回溯的模式,控制这些引擎以在线性时或多项式时状态下查找匹配。
.NET Framework 引擎功能
在充分利用传统 NFA 引擎优点的基础上,.NET Framework 正则表达式引擎包括了一组完整的构造,让程序员能够操纵回溯引擎。这些构造可被用于更快地找到匹配,或支持特定扩展,而非其他扩展。
其他功能包括:
- “惰性”限定符:??、*?、+?、{n,m}?。这些惰性限定符指示回溯引擎首先搜索最少数目的重复。与之相反,普通的“贪婪的”限定符首先尝试匹配最大数目的重复。
- 积极的预测先行。这允许回溯引擎在匹配子表达式后返回到文本中相同的作用点。这对于通过验证起始于相同位置的多个模式来搜索整个文本是很有用的。
- 消极的预测先行。这增加了只在子表达式匹配失败的情况下才匹配表达式的能力。这对于删改一个搜索特别有用,因为与必须被包括在内的情况的表达式相比,应被排除的情况的表达式通常要简单得多。(例如,编写搜索不以“non”起始的单词的表达式就很困难)。
- 条件计算。这允许引擎可以根据以前的子表达式匹配的结果,使用多个替换模式进行搜索。这提供了超越反向引用所允许的、更为强大的功能,例如,当以前在子表达式中捕获了左括号时匹配右括号。
- 非回溯子表达式(也称作“贪婪”子表达式)。这允许回溯引擎确保子表达式只匹配为该子表达式找到的第一个匹配项,就好像该表达式独立于其包含的表达式运行。如果没有此构造,来自更大的表达式的回溯搜索可能会更改子表达式的行为。
- 从右到左匹配。这在从右到左而非从左到右搜索的情况下十分有用,或者在从模式的右侧部分开始搜索比从模式的左侧部分开始搜索更为有效的情况下十分有用。
- 积极的和消极的追溯。类似于预测先行。因为正则表达式引擎允许完全的从右到左匹配,所以正则表达式允许无限制的追溯。
10 VS开发环境查找替换的正则表达式
正则表达式是查找和替换文本模式的一种简洁而灵活的表示法。在“查找和替换”窗口中执行“快速查找”、“在文件中查找”、“快速替换”或“在文件中替换”操作时,可以在该窗口的“查找内容”和“替换为”字段中使用一组专用的正则表达式。
若要启用正则表达式,请在“查找和替换”窗口中展开“查找选项”,选择“使用”,然后选择“正则表达式”。“查找内容”和“替换为”字段旁的三角形“表达式生成器”按钮将变为可用。单击此按钮可以列表显示最常用的正则表达式。当单击列表上的某个正则表达式时,它将插入“查找内容”或“替换为”字段中的光标所在位置。单击“表达式生成器”底部的“完整字符列表”时,会显示帮助主题。主题内容涵盖 Visual Studio“查找和替换”功能可以识别的所有正则表达式。您可以复制主题中的正则表达式,然后将其粘贴到“查找内容”或“替换为”字段中。
注意: |
“查找内容”和“替换为”中可使用的正则表达式与 .NET Framework 编程中的有效正则表达式有语法上的区别。例如,在“查找和替换”中,大括号符号 {} 用于带标记的表达式,表达式 zo{1} 匹配所有后跟标记 1 的 zo 项,如 Alonzo1 和 Gonzo1。此正则表达式语法不同于 .NET Framework,其中表示法 {} 用于限定符,表达式 zo{1} 可以匹配所有 z 后仅跟有一个 o 的搜索项,如 zone,但在 zoo 中不是。 |
用于“查找和替换”的正则表达式
“表达式生成器”中经常使用的正则表达式如下所示。
表达式 |
语法 |
说明 |
示例 |
任一字符 |
. |
匹配除换行符外的任何一个字符。 |
a.o 匹配“around”中的“aro”和“about”中的“abo”,但不匹配“across”中的“acro”。 |
零个或多个 |
* |
不匹配上一表达式,或匹配多次,并生成所有可能的匹配。 |
a*b 匹配“bat”中的“b”和“about”中的“ab”。 e.*e 匹配单词“enterprise”。 |
一个或更多个 |
+ |
匹配前面表达式的至少一个搜索项。 |
ac+ 匹配包含字母“a”和至少一个字母“c”的单词,如“race”和“ace”。 a.+s 匹配单词“access”。 |
行首 |
^ |
将匹配字符串锚定到行首。 |
^car 仅当单词“car”显示为编辑器行中的第一组字符时匹配该单词。 |
行尾 |
$ |
将匹配字符串锚定到行尾。 |
end$ 仅当单词“end”显示为可能位于编辑器中行尾的最后一组字符时匹配该单词。 |
词首 |
< |
仅当单词在文本中以此开头时才匹配。 |
<in 匹配以字母“in”开头的单词,如“inside”和“into”。 |
词尾 |
> |
仅当单词在文本中以此结尾时才匹配。 |
ss> 匹配以字母“ss”结尾的单词,如“across”和“loss”。 |
换行符 |
\n |
匹配与操作系统无关的换行符。在“替换”表达式中,插入换行符。 |
End\nBegin 仅当“End”是一行中的最后一个字符串和“Begin”是下一行中的第一个字符串时匹配单词“End”和“Begin”。 在“替换”表达式中, Begin\nEnd 使用“Begin”替换第一行中的单词“End”,插入换行符,然后使用单词“End”替换单词“Begin”。 |
集中的任何一个字符 |
[] |
匹配 [] 内的任何一个字符。若要指定字符的范围,请列出由短划线 (-) 分隔的起始字符和结束字符,如 [a-z]。 |
be[n-t] 匹配“between”中的“bet”、“beneath”中的“ben”和“beside”中的“bes”,但不匹配“below”中的“bel”。 |
集中没有的任何一个字符 |
[^...] |
匹配未在跟随 ^ 的字符集中指定的任何字符。 |
be[^n-t] 匹配“before”中的“bef”、“behind”中的“beh”和“below”中的“bel”,但是不匹配“beneath”中的“ben”。 |
或 |
| |
匹配 OR 符号 (|) 之前或之后的表达式。最常用在分组中。 |
(sponge|mud) bath 匹配“sponge bath”和“mud bath”。 |
转义符 |
\ |
按原义匹配反斜杠 (\) 之后的字符。这使您可以查找正则表达式表示法中使用的字符,如 { 和 ^。 |
\^ 搜索 ^ 字符。 |
带标记的表达式 |
{} |
匹配以带括号的表达式标记的文本。 |
zo{1} 匹配“Alonzo1”和“Gonzo1”中的“zo1”,但不匹配“zone”中的“zo”。 |
C/C++ 标识符 |
:i |
表达式 ([a-zA-Z_$][a-zA-Z0-9_$]*) 的简写形式。 |
匹配任何可能的 C/C++ 标识符。 |
带引号的字符串 |
:q |
表达式 (("[^"]*")|('[^']*')) 的简写形式,它匹配用双引号或单引号括起来的所有字符,还匹配引号本身。 |
:q 匹配“测试引用”和‘测试引用’,但不匹配“can't”中的“'t”。 |
空格或制表符 |
:b |
匹配空格或制表符。 |
Public:bInterface 匹配文本中的短语“Public Interface”。 |
整数 |
:z |
表达式 ([0-9]+) 的简写形式,它匹配数字字符的任何组合。 |
匹配任何整数,如“1”、“234”、“56”等等。 |
“查找”和“替换”操作中所有有效正则表达式的列表,比“表达式生成器”中可显示的列表长。尽管“表达式生成器”中没有显示下面的正则表达式,但您可以在“查找内容”或“替换为”字段中使用它们。
表达式 |
语法 |
说明 |
示例 |
最少、零个或更多个 |
@ |
匹配前面表达式的 0 个或更多搜索项,并匹配尽可能少的字符。 |
e.@e 匹配“enterprise”中的“ente”和“erprise”,但不匹配完整的单词“enterprise”。 |
最少、一个或更多个 |
# |
匹配前面表达式的一个或更多搜索项,并匹配尽可能少的字符。 |
ac# 匹配包含字母“a”和至少一个字母“c”的单词,如“ace”。 a.#s 匹配单词“access”中的“acces”。 |
重复 n 次 |
^n |
匹配前面表达式的 n 次出现。 |
[0-9]^4 匹配任意 4 位数字的序列。 |
分组 |
() |
允许将一组表达式组合在一起。如果要在一次操作中搜索两个不同的表达式,可以使用分组表达式来组合这两个表达式。 |
如果要搜索 - [a-z][1-3] 或 - [1-10][a-z],应按如下方式组合这两个表达式:([a-z][1-3]) | ([1-10][a-z])。 |
第 n 个带标记的文本 |
\n |
在“查找”或“替换”表达式中,指示第 n 个带标记的表达式所匹配的文本,其中 n 是从 1 至 9 的数字。 在“替换”表达式中,\0 插入整个匹配的文本。 |
如果搜索 a{[0-9]},并替换为 \1,则“a”后跟数字的所有搜索项由跟随的数字替换。例如,“a1”由“1”替换,类似地,“a2”由“2”替换。 |
右对齐字段 |
\(w,n) |
在“替换”表达式中,将字段中第 n 个带标记的表达式右对齐至少 w 字符宽。 |
如果搜索 a{[0-9]},并替换为 \(10,1),则“an”的搜索项由整数替换,并通过 10 个空格右对齐。 |
左对齐字段 |
\(-w,n) |
在“替换”表达式中,将字段中第 n 个带标记的表达式左对齐至少 w 字符宽。 |
如果搜索 a{[0-9]},并替换为 \(-10,1),则“an”由整数替换,并通过 10 个空格左对齐。 |
禁止匹配 |
~(X) |
当 X 出现在表达式中的此位置时禁止匹配。 |
real~(ity) 匹配“realty”和“really”中的“real”,但不匹配“reality”中的“real”。 |
字母数字字符 |
:a |
匹配表达式 ([a-zA-Z0-9])。 |
匹配任何字母数字字符,如“a”、“A”、“w”、“W”、“5”等等。 |
字母字符 |
:c |
匹配表达式 ([a-zA-Z])。 |
匹配任何字母字符,如“a”、“A”、“w”、“W”等等。 |
十进制数字 |
:d |
匹配表达式 ([0-9])。 |
匹配任何数字,如“4”和“6”。 |
十六进制数 |
:h |
匹配表达式 ([0-9a-fA-F]+)。 |
匹配任何十六进制数,如“1A”、“ef”和“007”。 |
有理数 |
:n |
匹配表达式 (([0-9]+.[0-9]*)|([0-9]*.[0-9]+)|([0-9]+))。 |
匹配任何有理数,如“2007”、“1.0”和“.9”。 |
字母字符串 |
:w |
匹配表达式 ([a-zA-Z]+)。 |
匹配任何仅包含字母字符的字符串。 |
转义符 |
\e |
Unicode U+001B。 |
匹配“转义”控制字符。 |
Bell |
\g |
Unicode U+0007。 |
匹配“Bell”控制字符。 |
Backspace |
\h |
Unicode U+0008。 |
匹配“Backspace”控制字符。 |
制表符 |
\t |
Unicode U+0009。 |
制表符匹配。 |
Unicode 字符 |
\x#### 或 \u#### |
匹配 Unicode 值给定的字符,其中 #### 是十六进制数。可以用 ISO 10646 代码点或两个提供代理项对的值的 Unicode 代码点指定基本多语种平面(即一个代理项)外的字符。 |
\u0065 匹配字符“e”。 |
下表列出了用于指定 Unicode 字符属性数据库中列出的通用类别的两个字母的缩写词。您可以在正则表达式字符集中使用这些缩写词。例如,表达式 [:Nd:Nl:No] 匹配任何类型的数字。
有关 Unicode 字符属性数据库的详细信息,请参见 Unicode Standard 5.0 Character Properties(Unicode Standard 5.0 字符属性)。
表达式 |
语法 |
说明 |
大写字母 |
:Lu |
匹配任何一个大写字母。 例如: :Luhe 匹配“The”但不匹配“the”。 |
小写字母 |
:Ll |
匹配任何一个小写字母。 例如: :Llhe 匹配“the”但不匹配“The”。 |
词首大写字母 |
:Lt |
匹配将大写字母和小写字母结合的字符,例如,Nj 和 Dz。 |
修饰符字母 |
:Lm |
匹配字母或标点符号,例如逗号、交叉重音符和双撇号,用于表示对前一字母的修饰。 |
其他字母 |
:Lo |
匹配其他字母,如哥特体字母 ahsa。 |
十进制数字 |
:Nd |
匹配十进制数(如 0-9)和它们的双字节等效数。 |
字母数字 |
:Nl |
匹配字母数字,例如罗马数字和表意数字零。 |
其他数字 |
:No |
匹配其他数字,如旧斜体数字一。 |
开始标点符号 |
:Ps |
匹配开始标点符号,例如左方括号和左大括号。 |
结束标点符号 |
:Pe |
匹配结束标点符号,例如右方括号和右大括号。 |
左引号 |
:Pi |
匹配左双引号。 |
右引号 |
:Pf |
匹配单引号和右双引号。 |
破折号 |
:Pd |
匹配破折号标记。 |
连接符号 |
:Pc |
匹配下划线标记。 |
其他标点符号 |
:Po |
匹配 (,)、?、"、!、@、#、%、&、*、\、(:)、(;)、' 和 /。 |
空白分隔符 |
:Zs |
匹配空白。 |
行分隔符 |
:Zl |
匹配 Unicode 字符 U+2028。 |
段落分隔符 |
:Zp |
匹配 Unicode 字符 U+2029。 |
无间隔标记 |
:Mn |
匹配无间隔标记。 |
组合标记 |
:Mc |
匹配组合标记。 |
封闭标记 |
:Me |
匹配封闭标记。 |
数学符号 |
:Sm |
匹配 +、=、~、|、< 和 >。 |
货币符号 |
:Sc |
匹配 $ 和其他货币符号。 |
修饰符号 |
:Sk |
匹配修饰符号,如抑扬音、抑音符号和长音符号。 |
其他符号 |
:So |
匹配其他符号,如版权符号、段落标记和度数符号。 |
其他控制 |
:Cc |
匹配类似 TAB 和 NEWLINE 这样的 Unicode 控制字符。 |
其他格式 |
:Cf |
格式控制字符,例如双向控制字符。 |
代理项 |
:Cs |
匹配代理项对的一半。 |
其他私用 |
:Co |
匹配私用区域的任何字符。 |
其他未分配字符 |
:Cn |
匹配未映射到 Unicode 字符的字符。 |
除标准 Unicode 字符属性外,还可以指定下列属性作为字符集的一部分。
表达式 |
语法 |
说明 |
Alpha |
:Al |
匹配任何一个字符。 例如,:Alhe 匹配“The”、“then”、“reached”等单词。 |
数字 |
:Nu |
匹配任何一个数或数字。 |
标点 |
:Pu |
匹配任何一个标点符号,如 ?、@、' 等等。 |
空白 |
:Wh |
匹配所有类型的空白,如印刷和表意文字的空白。 |
双向 |
:Bi |
匹配诸如阿拉伯文和希伯来文这类从右向左书写的字符。 |
朝鲜文 |
:Ha |
匹配朝鲜文和组合朝鲜文字母。 |
平假名 |
:Hi |
匹配平假名字符。 |
片假名 |
:Ka |
匹配片假名字符。 |
表意文字/汉字/日文汉字 |
:Id |
匹配表意文字字符,如汉字和日文汉字。 |