我需要搜索一系列错误单词的句子。我有功能,但是,它非常慢:
for (int i=0; i<[badWords count]; i++)
{
NSDictionary *dictionary = [badWords objectAtIndex:i];
if ([text rangeOfString:[NSString stringWithFormat:@"\\b%@\\b", [dictionary objectForKey:@"word"]] options:NSCaseInsensitiveSearch | NSRegularExpressionSearch].location != NSNotFound)
{
NSLog(@"Bad Word Found!");
}
}
有更快的方法吗?当我有很长的单词列表需要一段时间。谢谢!
答案 0 :(得分:0)
也许使用GCD会对速度有所帮助......
dispatch_queue_t dqt = dispatch_queue_create("queue.concurrent",DISPATCH_QUEUE_CONCURRENT);
dispatch_apply([array count],dqt,^(size_t idx){
NSDictionary *dictionary = [badWords objectAtIndex:idx];
if ([text rangeOfString:[NSString stringWithFormat:@"\\b%@\\b", [dictionary objectForKey:@"word"]] options:NSCaseInsensitiveSearch | NSRegularExpressionSearch].location != NSNotFound)
{
NSLog(@"Bad Word Found!");
}
}
});
dispatch_release(dqt);
但只有一点......
答案 1 :(得分:0)
不是进行多次正则表达式搜索,而是使用每个单词创建一个巨大的正则表达式模式,只进行一次搜索:
NSArray *words = @[@"foo", @"bar", ...];
NSRegularExpression *wordsExpression = [[NSRegularExpression alloc] initWithPattern:[[NSString alloc] initWithFormat:@"\\b(%@)\\b", [keywords componentsJoinedByString:@"|"]] options:NSRegularExpressionCaseInsensitive error:NULL];
[keywordsExpression enumerateMatchesInString:string options:0 range:range usingBlock:^(NSTextCheckingResult *match, NSMatchingFlags flags, BOOL *stop){
// do something with match
}];
这在我的测试中非常快(它在几千秒内完成),但是我在x86处理器上使用它。也许ARM处理器的性能特征是不同的,因为RegEx可能没有针对该架构进行优化。
我在这里使用它:https://github.com/abhibeckert/Dux/blob/master/Dux/DuxJavaScriptBaseElement.m