4
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 を取得するにはどうすればよいですか。NSAttributed 文字列の色を変更したいので、NSRange が必要です。

 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];
    }
}
4

3 に答える 3

38

この問題を解決する多くの方法NSScannerが言及されました。rangeOfString: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];
    }];
于 2012-11-29T08:33:00.453 に答える
20

[str rangeOfString:@"California"]

[str rangeOfString:@"California" options:YOUR_OPTIONS range:rangeToSearch]
于 2012-11-29T08:03:41.130 に答える
0

rangeOfString:options:range: または NSScanner を使用できます (正規表現のような他の可能性がありますが、とにかく)。最初のアプローチ更新範囲を使用する方が簡単です。つまり、最初の出現を検索し、結果に応じて検索範囲を更新します。検索範囲が空の場合、すべてが見つかりました。

于 2012-11-29T08:08:20.660 に答える