检查NSString是否只包含一个重复的字符

时间:2015-12-03 10:22:43

标签: objective-c string cocoa cocoa-touch nsstring

我想知道一种简单快捷的方法来确定NSString中的所有字符是否相同。

例如:

NSString *string = "aaaaaaaaa"
=> return YES
NSString *string = "aaaaaaabb"
=> return NO

我知道我可以通过使用循环实现它,但我的NSString很长所以我更喜欢更短更简单的方法。

3 个答案:

答案 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;