我想知道一种简单快捷的方法来确定NSString
中的所有字符是否相同。
例如:
NSString *string = "aaaaaaaaa"
=> return YES
NSString *string = "aaaaaaabb"
=> return NO
我知道我可以通过使用循环实现它,但我的NSString
很长所以我更喜欢更短更简单的方法。
答案 0 :(得分:3)
你可以使用它,用null替换第一个字符并检查lenght:
-(BOOL)sameCharsInString:(NSString *)str{
if ([str length] == 0 ) return NO;
return [[str stringByReplacingOccurrencesOfString:[str substringToIndex:1] withString:@""] length] == 0 ? YES : NO;
}
答案 1 :(得分:1)
以下两种可能性尽快失败并且没有(明确地)创建原始字符串的副本,这应该是有利的,因为你说字符串很大。
首先,使用NSScanner
重复尝试读取字符串中的第一个字符。如果循环在扫描仪到达字符串末尾之前结束,则会出现其他字符。
NSScanner * scanner = [NSScanner scannerWithString:s];
NSString * firstChar = [s substringWithRange:[s rangeOfComposedCharacterSequenceAtIndex:0]];
while( [scanner scanString:firstChar intoString:NULL] ) continue;
BOOL stringContainsOnlyOneCharacter = [scanner isAtEnd];
正则表达式也是解决这个问题的好工具,因为“一个字符后跟任意数量的字符重复”只用一个后向引用表达:
// Match one of any character at the start of the string,
// followed by any number of repetitions of that same character
// until the end of the string.
NSString * patt = @"^(.)\\1*$";
NSRegularExpression * regEx =
[NSRegularExpression regularExpressionWithPattern:patt
options:0
error:NULL];
NSArray * matches = [regEx matchesInString:s
options:0
range:(NSRange){0, [s length]}];
BOOL stringContainsOnlyOneCharacter = ([matches count] == 1);
这两个选项都正确处理多字节和组合字符;正则表达式版本也不需要显式检查空字符串。
答案 2 :(得分:0)
使用此循环:
NSString *firstChar = [str substringWithRange:NSMakeRange(0, 1)];
for (int i = 1; i < [str length]; i++) {
NSString *ch = [str substringWithRange:NSMakeRange(i, 1)];
if(![ch isEqualToString:firstChar])
{
return NO;
}
}
return YES;