【问题标题】:How to get NSRange(s) for a substring in NSString? [duplicate]如何为 NSString 中的子字符串获取 NSRange(s)? [复制]
【发布时间】:2012-11-17 06:12:37
【问题描述】:
NSString *str = @" My name is Mike, I live in California and I work in Texas. Weather in California is nice but in Texas is too hot...";

如何遍历这个 NSString 并为每次出现的“California”获取 NSRange,我想要 NSRange 因为我想在 NSAttributed 字符串中更改它的颜色。

 NSRange range = NSMakeRange(0,  _stringLength);
 while(range.location != NSNotFound)
 {
    range = [[attString string] rangeOfString: @"California" options:0 range:range];


    if(range.location != NSNotFound)
    {

        range = NSMakeRange(range.location + range.length,  _stringLength - (range.location + range.length));


        [attString addAttribute:NSForegroundColorAttributeName value:_green range:range];
    }
}

【问题讨论】:

    标签: ios nsstring uitextview nsattributedstring nsrange


    【解决方案1】:

    有很多解决这个问题的方法——提到了NSScannerrangeOfString:options:range 等。为了完整起见,我会提到 NSRegularExpression。这也有效:

        NSMutableAttributedString *mutableString = nil;
        NSString *sampleText = @"I live in California, blah blah blah California.";
        mutableString = [[NSMutableAttributedString alloc] initWithString:sampleText];
    
        NSString *pattern = @"(California)";
        NSRegularExpression *expression = [NSRegularExpression regularExpressionWithPattern:pattern options:0 error:nil];
    
        //  enumerate matches
        NSRange range = NSMakeRange(0,[sampleText length]);
        [expression enumerateMatchesInString:sampleText options:0 range:range usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
            NSRange californiaRange = [result rangeAtIndex:0];
            [mutableString addAttribute:NSForegroundColorAttributeName value:[NSColor greenColor] range:californiaRange];
        }];
    

    【讨论】:

    • rangeAtIndex 在这个例子中是错误的;它应该访问 0 而不是 1
    • 一切正常。
    【解决方案2】:

    [str rangeOfString:@"California"]
    

    [str rangeOfString:@"California" options:YOUR_OPTIONS range:rangeToSearch]
    

    【讨论】:

    • [str rangeOfString:@"California"] 是在 NSString 中查找子字符串范围的好方法。
    【解决方案3】:

    您可以使用 rangeOfString:options:range: 或 NSScanner(还有其他可能性,例如正则表达式,但无论如何)。使用第一种方法更新范围更容易,即搜索第一次出现,然后根据结果更新搜索范围。当搜索范围为空时,您已找到所有内容;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-06
      • 1970-01-01
      • 1970-01-01
      • 2014-06-14
      • 2014-07-11
      • 1970-01-01
      • 2019-02-11
      相关资源
      最近更新 更多