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

Check if NSString only contains one character repeated

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

例如:

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

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

使用这个循环:

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;

你可以使用它,将第一个字符替换为 null 并检查长度:

-(BOOL)sameCharsInString:(NSString *)str{
    if ([str length] == 0 ) return NO;
    return [[str stringByReplacingOccurrencesOfString:[str substringToIndex:1] withString:@""] length] == 0 ? YES : NO;
}

这里有两种可能性,它们会尽快失败并且不会(明确地)创建原始字符串的副本,这应该是有利的,因为您说字符串很大。

首先,使用NSScanner反复尝试读取字符串中的第一个字符。如果在扫描器到达字符串末尾之前循环结束,则存在其他字符。

NSScanner * scanner = [NSScanner scannerWithString:s];
NSString * firstChar = [s substringWithRange:[s rangeOfComposedCharacterSequenceAtIndex:0]];
while( [scanner scanString:firstChar intoString:NULL] ) continue;

BOOL stringContainsOnlyOneCharacter = [scanner isAtEnd];

正则表达式也是解决此问题的好工具,因为 "a character followed by any number of repetitions of that character" 非常简单地用单个反向引用表示:

// 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);

这两个选项都能正确处理多字节和组合字符;正则表达式版本也不需要显式检查空字符串。