如何确定NSString的第一个字符是否为字母

时间:2013-05-31 14:51:06

标签: objective-c nsstring

在我的应用中

我需要知道字符串的第一个字符是否是一个字母

我得到了这个字符串的第一个字符

NSString *codeString;
 NSString *firstLetter = [codeString substringFromIndex:1];

我可以通过与a,b,c,。**进行比较来了解它。

if([firstLetter isEqualToString "a"] || ([firstLetter isEqualToString "A"] || ([firstLetter isEqualToString "b"] ......)

但还有其他方法可以知道吗?

我需要为字母和符号显示不同的颜色。

我怎样才能以简单的方式实现它?

1 个答案:

答案 0 :(得分:86)

首先,你的行:

NSString *firstLetter = [codeString substringFromIndex:1];

没有得到第一个字母。这给你一个新的字符串,包含所有原始字符串EXCEPT的第一个字符。这与你想要的相反。你想要:

NSString *firstLetter = [codeString substringToIndex:1];

但是有一种更好的方法可以查看第一个字符是否是一个字母。

unichar firstChar = [[codeString uppercaseString] characterAtIndex:0];
if (firstChar >= 'A' && firstChar <= 'Z') {
    // The first character is a letter from A-Z or a-z
}

然而,由于iOS应用程序与国际用户打交道,因此简单地查找字母A-Z中的字符远非理想。更好的方法是:

unichar firstChar = [codeString characterAtIndex:0];
NSCharacterSet *letters = [NSCharacterSet letterCharacterSet];
if ([letters characterIsMember:firstChar]) {
    // The first character is a letter in some alphabet
}

在某些情况下,这不能按预期工作。 unichar仅包含16位字符。但NSString值实际上可以包含一些32位字符。示例包括许多表情符号字符。所以这个代码可能会产生误报。理想情况下,您可能希望这样做:

NSRange first = [codeString rangeOfComposedCharacterSequenceAtIndex:0];
NSRange match = [codeString rangeOfCharacterFromSet:[NSCharacterSet letterCharacterSet] options:0 range:first];
if (match.location != NSNotFound) {
    // codeString starts with a letter
}