如何确定NSString是否全部大写

时间:2013-04-28 15:09:40

标签: ios nsstring

我如何确定字符串是否全部为大写字母?

我知道你可以检查每个角色是否属于upperCase角色集,但有更快的方法吗?

4 个答案:

答案 0 :(得分:8)

您可以尝试以下方式:

if ([[s uppercaseStringWithLocale:[NSLocale currentLocale]] isEqualToString:s])
{
    // ... s is uppercase ...
}
else
{
    // ... s is not all uppercase ...
}

答案 1 :(得分:7)

有几种不同的方法可以解释您的问题,每个示例都只测试您的字符串,而无需创建新副本:

1)您希望确保字符串中的所有字母都是大写的(但仍允许使用其他字符,如标点符号,数字和空格)。例如:

NSCharacterSet *lowerCaseSet = [NSCharacterSet lowercaseLetterCharacterSet];

if ([myString rangeOfCharacterFromSet:lowerCaseSet].location == NSNotFound)
    NSLog(@"String is in upper case.");
else
    NSLog(@"String has invalid characters.");

2)您希望确保字符串中的所有字符都是大写字符(并且不允许其他字符)。例如:

NSCharacterSet *invalidCharacterSet = [[NSCharacterSet uppercaseLetterCharacterSet] invertedSet];

if ([myString rangeOfCharacterFromSet:invalidCharacterSet].location == NSNotFound)
    NSLog(@"String has only upper case characters.");
else
    NSLog(@"String has invalid characters.");

3)您希望确保字符串中的所有字符都是大写字符或空格(并且不允许其他字符)。例如:

NSMutableCharacterSet *allowedCharacterSet = [NSMutableCharacterSet uppercaseLetterCharacterSet];
[allowedCharacterSet formUnionWithCharacterSet:[NSCharacterSet whitespaceCharacterSet]];
NSCharacterSet *invalidCharacterSet = [allowedCharacterSet invertedSet];

if ([myString rangeOfCharacterFromSet:invalidCharacterSet].location == NSNotFound)
    NSLog(@"String has only upper case characters and/or white space.");
else
    NSLog(@"String has invalid characters.");

答案 2 :(得分:0)

这取决于你正在寻找什么。

如果您想知道字符串是否只包含大写字母。我会寻找[A-Z] *的正则表达式匹配并比较长度。我不确定[A-Z] *对于非英语字母表有多可靠。

如果你想知道字符串中是否有小写字符,但你不关心标点符号,那么user1118321的答案是好的。

答案 3 :(得分:0)

这里有许多好的答案,所以让我只使用一个与几个国家字母表中的字母一起使用的正则表达式。

Gordon Dove正确地提到,传统的[A-Z]*仅匹配拉丁语/英语字母表中从A到Z的实际字符,并且不能用于例如重音字符或其他字母表。

因此,为了完整起见,这里是ICU正则表达式,它匹配由它们定义的大写字母:\p{Lu}(单个大写字母)。

为了测试它(有一些西欧字符,我可以在键盘上输入,读者可以随意添加其他字符):

NSString *lowercase = @"äbcdéfghìjklmñöpqrstûvwxyzæøå";
NSString *mixedcase = @"ÄbcDÉFGHïjkLmÑÖpqrstÛvwxyzÆøÅ";
NSString *uppercase = @"ÄBCDÉFGHÏJKLMÑÖPQRSTÛVWXYZÆØÅ";

NSArray *cases = @[lowercase, mixedcase, uppercase];

NSString *uppercasePattern = @"\\p{Lu}*"; // Letter, uppercase, zero or more occurrences

NSPredicate *ucPred = [NSPredicate predicateWithFormat:@"self MATCHES %@", uppercasePattern];

NSArray *ucArray = [cases filteredArrayUsingPredicate:ucPred];

如果您只需要测试单个字符串,则可以直接使用谓词:

if ( [ucPred evaluateWithObject:uppercase] )  {
    NSLog(@"It's uppercase");
}

您不必将模式字符串定义为单独的变量,但我倾向于发现它增强了代码的可读性。