gpt4 book ai didi

objective-c - 有没有办法获取另一个 NSString 中出现的 NSString 的 NSRanges 的 NSArray?

转载 作者:行者123 更新时间:2023-12-03 16:55:50 25 4
gpt4 key购买 nike

我最近一直在为个人项目开发一个易于使用的语法突出显示系统。到目前为止,通过查找特定字符串的范围并在 NSTextView 中突出显示该范围,一切正常。一切正常,直到您尝试键入突出显示的单词两次,这会导致以下错误:

<div class="container">
<div> <!-- This <div> would not get highlighted -->
Hello World
</div>
</div> <!-- this </div> would not get highlighted -->

我相信发生这种情况是因为我只使用 rangeOfString 方法获取 NSString 的第一次出现,因此,只有第一个突出显示的项目被突出显示。

抱歉,解释太长了!不管怎样,我想知道是否有一个 rangeOfString 方法或类似的方法可以为我在另一个 NSString 中每次出现 NSString 时提供一个 NSRanges 的 NSArray 。下面是我当前用来获取范围的代码行:

NSString *textViewString = [textView string];
NSString *textToHighlight = @"<div>";
NSRange area;

area.location = 0;
area.length = [textViewString length];

NSRange range = [textViewString rangeOfString: textToHighlight
options: NSCaseInsensitiveSearch
range: area];

我想要的是这样的:

NSString *textViewString = [textView string];
NSString *textToHighlight = @"<div>";
NSRange area;

area.location = 0;
area.length = [textViewString length];

NSArray *ranges = [textViewString rangesOfString: textToHighlight
options: NSCaseInsensitiveSearch
range: area];

int i;
int total = [ranges count];
for (i = 0; i < total; i++) {
NSRange occurrence = [ranges objectAtIndex: i];
// Apply color highlighting here
}

如果这是不可能的,有人可以指出我正确的方向或建议一种进行语法突出显示的替代方法吗?谢谢!

最佳答案

没有这样的方法。您可以使用 rangeOfSubstring:options:range: 来获取每个匹配项,并缩小范围:在每个匹配项之后,您将搜索范围的位置更改为 (location + length of) 之后的字符匹配范围并按差值减少搜索范围的长度。

<小时/>

在现代基于 block 的世界中,编写an “enumerate substrings that match…” method并不难。执行上述操作。看起来像这样:

- (NSUInteger) enumerateSubstringsMatchingString_PRH:(NSString *)stringToFind
options:(NSStringCompareOptions)mask
usingBlock:(void (^)(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop))block
{
NSUInteger count = 0;

NSUInteger selfLength = self.length;
NSRange searchRange = { 0, selfLength };
NSRange foundRange;
BOOL stop = NO;
while (( ! stop ) && (foundRange = [self rangeOfString:stringToFind options:mask range:searchRange]).location != NSNotFound) {
++count;
if (block != NULL) {
@autoreleasepool {
NSString *substring = [self substringWithRange:foundRange];
block(substring, foundRange, /*TODO include terminators and separators in enclosingRange as described in enumerateSubstringsWithOptions:: docs*/ foundRange, &stop);
}
}
searchRange.location = NSMaxRange(foundRange);
if (searchRange.location >= self.length)
break;
searchRange.length = selfLength - searchRange.location;
}

return count;
}

我上面链接的要点给出了一些明显的测试用例。

关于objective-c - 有没有办法获取另一个 NSString 中出现的 NSString 的 NSRanges 的 NSArray?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3647270/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com