字符类
更新:2007 年 11 月
字符类表示一组可以匹配输入字符串的字符。组合原义字符、转义符和字符类以构成正则表达式模式。
字符类将定义字符集。一些字符类等同于一个或多个 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 架构正则表达式对字符类减法具有类似的支持。