【问题标题】:Check if NSString only contains one character repeated检查 NSString 是否只包含一个重复的字符
【发布时间】:2016-03-07 21:52:03
【问题描述】:

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

例如:

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

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

【问题讨论】:

  • 我写这篇文章时提出的解决方案都不适用于包含多个 unichar 的字符(字形)。根据您的用例,这可能很重要。

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    首先,使用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);
    

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

    【讨论】:

      【解决方案3】:

      使用这个循环:

      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;
      

      【讨论】:

      • 这个答案是正确的,但你知道另一个更短的方法吗?
      猜你喜欢
      • 1970-01-01
      • 2018-12-20
      • 1970-01-01
      • 1970-01-01
      • 2013-03-08
      • 1970-01-01
      • 2015-09-28
      • 2011-07-11
      • 1970-01-01
      相关资源
      最近更新 更多