字符类

更新: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 架构正则表达式对字符类减法具有类似的支持。

请参见

参考

GetUnicodeCategory

正则表达式选项

其他资源

正则表达式语言元素