1

我将如何确定一个字符串是否全部大写?

我知道您可以检查每个单独的字符是否属于大写字符集,但是有更快的方法吗?

4

4 回答 4

8

您可以尝试以下方法:

if ([[s uppercaseStringWithLocale:[NSLocale currentLocale]] isEqualToString:s])
{
    // ... s is uppercase ...
}
else
{
    // ... s is not all uppercase ...
}
于 2013-04-28T15:12:40.483 回答
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.");
于 2013-04-28T16:30:46.100 回答
0

这有点取决于你在寻找什么。

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

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

于 2013-04-28T15:34:12.590 回答
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");
}

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

于 2013-04-28T16:58:42.013 回答