C# 3.0 Cookbook:二、字符与字符串处理(1):判断字符类型
问题:
一个char类型的变量,我们要得到其中包含的字符类型是字母、阿拉伯数字、标点符号、控制符号、分隔符、特殊符号、空格还是替代符(例如值大于64K的Unicode字符集)。同样,一个string类型的变量,我们要得到其中某一个字符或某几个字符的类型。解决方案:
要得到字符的类型,可以使用System.Char命名空间中的内置静态方法,具体如下:
Char.IsControl | Char.IsDigit |
Char.IsLetter | Char.IsNumber |
Char.IsPunctuation | Char.IsSeparator |
Char.IsSurrogate | Char.IsSymbol |
Char.IsWhitespace |
讨论:
下面的例子描述了用怎样的方法可以返回一个字符的类型。首先,要创建一个几种字符类型的枚举类型:
public enum CharKind { Digit, Letter, Number, Punctuation, Unknown }
接下来,创建一个包含判断字符类型并且返回值为CharKind枚举类型的的扩展方法:
static class CharStrExtMethods { public static CharKind GetCharKind(this char theChar) { if (Char.IsLetter(theChar)) { return CharKind.Letter; } else if (Char.IsNumber(theChar)) { return CharKind.Number; } else if (Char.IsPunctuation(theChar)) { return CharKind.Punctuation; } else { return CharKind.Unknown; } } }
GetCharKind扩展方法展示了使用多种内置静态方法测试字符类型的手段。所有不同的字符类型被定义在一个枚举类型并且由GetCharKind方法返回。
假如无论怎样,一个字符串中的每个字符都要需要被测试其类型,可使用char结构的静态重载方法。接下来的代码修改了GetCharKind扩展方法,操作字符串变量接受
static class CharStrExtMethods { public static CharKind GetCharKindInString(this string theString, int charPosition) { if (Char.IsLetter(theString, charPosition)) { return CharKind.Letter; } else if (Char.IsNumber(theString, charPosition)) { return CharKind.Number; } else if (Char.IsPunctuation(theString, charPosition)) { return CharKind.Punctuation; } else { return CharKind.Unknown; } } }
接下来的代码段判断字符串中的第5个字符是否为数字。(charPosition参数从0开始计数)
string data = "abcdefg"; if (string.GetCharKindInString(4) == CharKind.Digit) {...}
表2-1描述了char结构中的每一个静态方法:
表2-1:char结构方法
char 方法 | 描述 |
IsControl | 是否属于在范围\U007F, \U0000至\U001F, 和\U0080至\U009F的控制字符代码。 |
IsDigit | 是否属于在Unicode字符集中任意0到9的十进制数。 |
IsLetter | 是否属于字母类别。 |
IsNumber | 是否属于十进制数或十六进制数,包含上标文字和下标文字。 |
IsPunctuation | 是否属于标点符号。 |
IsSeparator | 是否属于分隔字符、分隔线或段落分隔符。 |
IsSurrogate | 是否属于在范围\UD800至\UDFFF之间的代理项字符。 |
IsSymbol | 是否属于任意的自述、货币、或其他符号类别,或其他修饰符。 |
IsWhitespace | 是否属于以下空白类型字符:
\U0009 |
在.NET 2.0框架中,有少数额外的Is*类型的函数被添加进来以增强现有的方法,如果问题中的字符是一个字母(也就是IsLetter方法返回为true),可以用表2-2的方法再判断字母是否为大写还是小写。
表2-2:Char 结构的Uppercase 和 lowercase 方法
char 方法 | 描述 |
IsLower | 字符是否为小写字母。 |
IsUpper | 字符是否为大写字母。 |
如果问题中的字符是代理项字符(也就是IsSurrogate方法返回为true),可以使用表2-3中的方法得到更多代理项字符的信息。
表2-3:Char 结构的Surrogate方法
char 方法 | 描述 |
IsHighSurrogate | 范围在\UD800 至 \UDBFF之间的字符。 |
IsLowSurrogate | 范围在\UDC00 至\UDFFF之间的字符。 |
除以上的Surrogate方法以外,当一个代理字符项由两个字符组成时,IsSurrogatePair方法返回true,也就是说当一人字符为高位替代符,当另一个字符为低位替代符时。
最后在这组方法中要补充说明的是IsLetterOrDigit方法,当问题中的字符为字母或数字时该方法返回true,当需要判断某个字符是否为字母或数字时,可以使用IsLetter 方法和IsDigit 方法。
还可参见
MSDN中的“Char 结构”相关文档。