2013-04-28 34 views

回答

6

你可以尝试这样的:

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

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

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

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

6

有几种不同的方式来诠释你的问题,并且每个例子只是测试你的字符串,而无需创建一个新的副本:

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."); 
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"); 
} 

您不必定义模式字符串作为一个单独的变量,但我倾向于认为它提高代码的可读性。