字符类是一个字符集,如果字符集中的任何一个字符有匹配,它就会找到该匹配项。
定义
字符类是
正则表达式中的“迷你”语言,在方括号 [ ] 中定义。最简单的字符类只不过是括号中的一个字符表,如 [aeiou]。在表达式中使用字符类时,可在模式的此位置使用其中任何一个字符(但只能使用一个字符,除非使用了限定符)。请注意,不能使用字符类定义单词或模式,只能定义单个字符。
正则表达式中的字符类
一个字符类定义一组字符,其中的任一字符均可出现在输入字符串中以便成功匹配。
.NET Framework中的
正则表达式语言支持以下字符类:
.NET Framework支持字符类减法表达式,通过该表达式可以定义一组字符作为从一个字符类中排除另一字符类的结果。
正字符组:[ ]
正字符组指定一个字符列表,其中的任何一个字符可出现在输入字符串中以便进行匹配。此字符列表可以单独指定和/或作为范围指定。
用于指定各个字符列表的语法如下所示:
[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]。
负字符组中的前导符 (^) 是强制的,指示字符组为负字符组,而不是正字符组。
下表列出了一些常见的包含负字符组的正则表达式模式
任意字符:.
句点字符 (.) 匹配除
(换行符
)之外的任何字符,有以下两个限制:
Unicode 标准为每个常规类别分配一个字符。例如,特定字符可以是大写字母(由 Lu 类别表示),十进制数字(Nd 类别)、数学符号(Sm 类别)或段落分隔符(Zl 类别)。Unicode 标准中的特定字符集也占据连续码位的特定区域或块。例如,可在 和 之间找到基本拉丁字符集,并可在 和 ۿ 之间找到阿拉伯语字符集。
正则表达式构造:
名称}
匹配属于 Unicode 常规类别或命名块的任何字符,其中,名称是类别缩写或命名块的名称。
Unicode 标准为每个常规类别分配一个字符。例如,特定字符可以是大写字母(由 Lu 类别表示),十进制数字(Nd 类别)、数学符号(Sm 类别)或段落分隔符(Zl 类别)。Unicode 标准中的特定字符集也占据连续码位的特定区域或块。例如,可在 和 之间找到基本拉丁字符集,并可在 和 ۿ 之间找到阿拉伯语字符集。
正则表达式构造:
名称}
匹配不属于 Unicode 常规类别或命名块的任何字符,其中,名称是类别缩写或命名块的名称。
换言之,它与下表中列出的字符以外的任何字符匹配。
支持的 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]。
POSIX风格的正则表达式
论述
POSIX风格的正则表达式使用Unix地区系统(locale system),该系统提供了排序和识别字符的函数来让你
智能地处理其他非英语的文本。特别地,各种语言组成单词的”字母”(如à和ç)不同,POSIX正则表达式考虑到了这一点并提供相应的字符类。
然而,
POSIXPerl风格的正则表达式函数常常比等效的
POSIX风格的函数快。
POSIX字符类型
POSIX定义了许多可以在字符类中使用的命名字符集。
每一个[:something:]类都可被用于替代一个字符类中的字符。例如,要查找任一数字字符、大写字母或一个@ 符号,可以使用下面的正则表达式:
[@[:digit:][:upper:]]
但是,不能把一个字符类当作一个范围的终点使用:
ereg('[A-[:lower:]]', 'string'); //非法的正则表达式
一些地区把某些字符序列当作一个单独的字符来考虑——它们被称为排序序列(collating sequence)。在字符类中匹配这些多字符序列中的一个时,要把它用[. 和 .]括起来。
例如,如果你的地区有排序序列ch,你可以使用下面的字符类来匹配s、t或ch:
[st[.ch.]]
POSIX最后的字符类扩展是等价类(equivalence class),把字符用[=和=]括起来指定。等价字符类匹配有相同整理顺序的字符(由当前locale定义)。例如,一个地区可能定义a、á和 ä有相同的排序优先级。要匹配它们中的一个,等价类为[=a=]。