1

我试图让某些字符在两个字符之间是不同的颜色,<并且>. 我尝试使用这种方法来做到这一点

-(NSString*)stringBetweenString:(NSString*)start andString:(NSString*)end fromString:(NSString*)other{
NSScanner* scanner = [NSScanner scannerWithString:other];
[scanner setCharactersToBeSkipped:nil];
[scanner scanUpToString:start intoString:NULL];
if ([scanner scanString:start intoString:NULL]) {
    NSString* result = nil;
    if ([scanner scanUpToString:end intoString:&result]) {
        return result;
    }
}
return nil;
}

这就是我想要的,但仅限于一个子字符串。我在这些字符之间有多个子字符串,并且希望它们都是不同的颜色。我用来改变颜色的方法是这样的

[self.tv setTextColor:[NSColor redColor] range:[s1 rangeOfString:[self stringBetweenString:@"<" andString:@">" otherString:s1] options:NSCaseInsensitiveSearch]];

哪里self.tvNSTextView。如何获取多个子字符串的范围并更改这些子字符串的颜色?

4

1 回答 1

2

对于您的情况,使用NSScanner不是最好的方法 - 您正在从字符串中复制一个子字符串,然后在字符串中搜索该子字符串以获取其范围,这是相当间接的。两种替代方法:

  1. NSString有一个有用的查找enumerateSubstringsInRange:options:usingBlock:方法,它可以找到各种类型的子字符串,并将它们依次呈现给要处理的块。不幸的是,没有一种是“尖括号之间的文本”,但您可以设计一个类似的方法,它接受一个字符串和一个块,然后将尖括号中的每个子字符串依次传递给它。如何找到子字符串?在这种情况下NSString,可以帮助您rangeOfString:options:range:- 这会在另一个字符串的给定范围内查找一个字符串。如果您开始寻找作为范围传递整个字符串的开放尖括号,您将获得第一个尖括号的范围(如果有)。现在再次调用它,搜索你的右尖括号传递作为范围字符串之后的开头。如果找到一个右尖括号,那么您就有了第一个子字符串 - 将它传递给您的块。重复直到您停止查找子字符串。
  2. 您可以使用正则表达式搜索(参见NSRegularExpression)一次性查找所有子字符串,然后处理返回的列表。

HTH。

于 2013-03-10T07:30:08.807 回答