定义
字符类是正则表达式中的“迷你”语言,在方括号 [ ] 中定义。最简单的字符类只不过是括号中的一个字符表,如 [aeiou]。在表达式中使用字符类时,可在模式的此位置使用其中任何一个字符(但只能使用一个字符,除非使用了限定符)。请注意,不能使用字符类定义单词或模式,只能定义单个字符。1
正则表达式中的字符类一个字符类定义一组字符,其中的任一字符均可出现在输入字符串中以便成功匹配。.NET Framework中的正则表达式语言支持以下字符类:
正字符组。 输入字符串中的字符必须匹配一组指定的字符中的某个字符。
负字符组。 输入字符串中的字符不得匹配一组指定的字符中的某个字符。
任意字符。 正则表达式中的 .(圆点或句点)字符是匹配除 \n 之外的任何字符的通配符字符。
通用 Unicode 类别或命名块。 输入字符串中的字符必须为特定 Unicode 类别的成员,或必须位于一系列连续的 Unicode 字符中才能成功匹配。
负通用 Unicode 类别或命名块。 输入字符串中的字符不得为特定 Unicode 类别的成员,也不得位于一系列连续的 Unicode 字符中以便成功匹配。
单词字符。 输入字符串中的字符可以属于适合单词中字符的任何 Unicode 类别。
非单词字符。 输入字符串中的字符可以属于作为非单词字符的任何 Unicode 类别。
空白字符。 输入字符串中的字符可以是任何 Unicode 分隔符字符以及众多控制字符中的任一字符。
非空白字符。 输入字符串中的字符可以是作为非空白字符的任何字符。
十进制数字。 输入字符串中的字符可以是归类为 Unicode 十进制数字的众多字符中的任一字符。
非十进制数字。 输入字符串中的字符可以是任何非 Unicode 十进制数字。
.NET Framework支持字符类减法表达式,通过该表达式可以定义一组字符作为从一个字符类中排除另一字符类的结果。2
正字符组:[ ]正字符组指定一个字符列表,其中的任何一个字符可出现在输入字符串中以便进行匹配。此字符列表可以单独指定和/或作为范围指定。
用于指定各个字符列表的语法如下所示:
[character_group]
其中,character_group 是单个字符的列表,这些字符可出现在输入字符串中以便成功匹配。 character_group 可以包括一个或多个文本字符、 转义符或字符类的任意组合。
用于指定字符范围的语法如下:
[firstCharacter-lastCharacter]
其中,firstCharacter 是范围的开始字符,lastCharacter 是范围的结束字符。字符范围是通过以下方式定义的一系列连续字符:指定系列中的第一个字符,连字符 (-),然后指定系列中的最后一个字符。如果两个字符具有相邻的 Unicode 码位,则这两个字符是连续的。
下表列出了一些常见的包含正字符类的正则表达式模式。
|| ||
负字符组:[^]负字符组指定一个字符列表,这些字符不得出现在输入字符串中以便进行匹配。此字符列表可以单独指定和/或作为范围指定。
用于指定各个字符列表的语法如下所示:
[^character_group]
其中,character_group 是单个字符的列表,这些字符不可出现在输入字符串中以便成功匹配。 character_group 可以包括一个或多个文本字符、 转义符或字符类的任意组合。
用于指定字符范围的语法如下:
[^firstCharacter-lastCharacter]
其中,firstCharacter 是范围的开始字符,lastCharacter 是范围的结束字符。字符范围是通过以下方式定义的一系列连续字符:指定系列中的第一个字符,连字符 (-),然后指定系列中的最后一个字符。如果两个字符具有相邻的 Unicode 码位,则这两个字符是连续的。
可以连接两个或更多字符范围。例如,若要指定从“0”至“9”的十进制数范围、从“a”至“f”的小写字母范围,以及从“A”至“F”的大写字母范围,请使用 [0-9a-fA-F]。
负字符组中的前导符 (^) 是强制的,指示字符组为负字符组,而不是正字符组。
下表列出了一些常见的包含负字符组的正则表达式模式
|| ||
任意字符:.句点字符 (.) 匹配除 \n(换行符 \u000A)之外的任何字符,有以下两个限制:
如果通过 RegexOptions.Singleline 选项修改正则表达式模式,或者通过 . 选项修改包含 s 字符类的模式的部分,则 . 可匹配任何字符。
正字符组或负字符组中的句点字符将被视为原义句点字符,而非字符类。
Unicode类别或Unicode块:\p{}Unicode 标准为每个常规类别分配一个字符。例如,特定字符可以是大写字母(由 Lu 类别表示),十进制数字(Nd 类别)、数学符号(Sm 类别)或段落分隔符(Zl 类别)。Unicode 标准中的特定字符集也占据连续码位的特定区域或块。例如,可在 \u0000 和 \u007F 之间找到基本拉丁字符集,并可在 \u0600 和 \u06FF 之间找到阿拉伯语字符集。
正则表达式构造:
\p{名称}
匹配属于 Unicode 常规类别或命名块的任何字符,其中,名称是类别缩写或命名块的名称。
负 Unicode 类别或 Unicode 块:\P {}Unicode 标准为每个常规类别分配一个字符。例如,特定字符可以是大写字母(由 Lu 类别表示),十进制数字(Nd 类别)、数学符号(Sm 类别)或段落分隔符(Zl 类别)。Unicode 标准中的特定字符集也占据连续码位的特定区域或块。例如,可在 \u0000 和 \u007F 之间找到基本拉丁字符集,并可在 \u0600 和 \u06FF 之间找到阿拉伯语字符集。
正则表达式构造:
\P{名称}
匹配不属于 Unicode 常规类别或命名块的任何字符,其中,名称是类别缩写或命名块的名称。
单词字符:\w\w 与任何单词字符匹配。单词字符是下表中列出的任何 Unicode 类别的成员。
|| ||
如果指定了符合 ECMAScript 的行为,则 \w 等效于 [a-zA-Z_0-9]。
非单词字符:\W\W 匹配任何非单词字符。\W 语言元素等效于以下字符类:
[^\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}\p{Lm}]
换言之,它与下表中列出的字符以外的任何字符匹配。
|| ||
如果指定了符合 ECMAScript 的行为,则 \W 等效于 [^a-zA-Z_0-9]。
空白字符:\s\s 匹配任何空白字符。它等效于下表中列出的转义序列和 Unicode 类别。
|| ||
如果指定了符合 ECMAScript 的行为,则 \s 等效于 [\f\n\r\t\v]。
非空白字符:\S\S 匹配任何非空白字符。它等效于 [^\f\n\r\t\v\x85\p{Z}] 正则表达式模式或与等效于 \s 的正则表达式模式(与空白字符匹配)相反。
如果指定了符合 ECMAScript 的行为,则 \S 等效于 [^ \f\n\r\t\v]。
十进制数字字符:\d\d 匹配任何十进制数字。它等效于 \p{Nd} 正则表达式模式,该模式包含标准的十进制数字 0-9 以及众多其他字符集的十进制数字。
如果指定了符合 ECMAScript 的行为,则 \d 等效于 [0-9]。
非数字字符:\D\D 匹配任何非数字字符。它等效于 \P{Nd} 正则表达式模式。
如果指定了符合 ECMAScript 的行为,则 \D 等效于 [^0-9]。
支持的 Unicode 常规类别Unicode 定义下表列出的常规类别。
|| ||
可以通过将任何特定字符传递到 GetUnicodeCategory 方法来确定该字符的 Unicode 类别。
支持的命名块.NET Framework提供下表列出的命名块。该组支持的命名块基于 Unicode 4.0 和 Perl 5.6。
|| ||
字符类减法:[base_group - [excluded_group]]
一个字符类定义一组字符。字符类减法将产生一组字符,该组字符是从一个字符类中排除另一个字符类中的字符的结果。
字符类减法表达式具有以下形式:
[base_group-[excluded_group]]
方括号 ([]) 和连字符 (-) 是强制的。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 常规类别中减去 IsBasicLatin 字符范围内的所有字符,其结果为空集合。类似地,表达式 [a-z-[0-9]] 的结果为初始基本组。这是因为,基本组(它是从“a”至“z”的字母组成的字符范围)不包含排除组(它是从“0”至“9”的十进制数组成的字符范围)中的任何字符。2
POSIX风格的正则表达式论述POSIX风格的正则表达式使用Unix地区系统(locale system),该系统提供了排序和识别字符的函数来让你智能地处理其他非英语的文本。特别地,各种语言组成单词的”字母”(如à和ç)不同,POSIX正则表达式考虑到了这一点并提供相应的字符类。
然而,POSIX正则表达式是为使用仅有原文的数据而设计的。如果数据中有空字节(\x00),那么正则表达式函数把它理解为字符串的末尾,并且匹配不会超过该字节位置。要匹配任意的二进制数据,需要使用兼容Perl的正则表达式。Perl风格的正则表达式函数常常比等效的POSIX风格的函数快。3
POSIX字符类型POSIX定义了许多可以在字符类中使用的命名字符集。
每一个[:something:]类都可被用于替代一个字符类中的字符。例如,要查找任一数字字符、大写字母或一个@ 符号,可以使用下面的正则表达式:
[@[:digit:][:upper:]]
但是,不能把一个字符类当作一个范围的终点使用:
ereg('[A-[:lower:]]', 'string'); //非法的正则表达式
一些地区把某些字符序列当作一个单独的字符来考虑——它们被称为排序序列(collating sequence)。在字符类中匹配这些多字符序列中的一个时,要把它用[. 和 .]括起来。
例如,如果你的地区有排序序列ch,你可以使用下面的字符类来匹配s、t或ch:
[st[.ch.]]
POSIX最后的字符类扩展是等价类(equivalence class),把字符用[=和=]括起来指定。等价字符类匹配有相同整理顺序的字符(由当前locale定义)。例如,一个地区可能定义a、á和 ä有相同的排序优先级。要匹配它们中的一个,等价类为[=a=]。3
|| || POSIX字符集