在Objective C中是否可以同时在NSString中搜索多个不同的字符串?
例如,我想在很长的字符串中搜索所有出现的字符串“good”,“great”,“awesome”,“incredible”,“fantastic”和“brilliant”。
我的第一个问题是使用NSString:rangeOfString
:并循环多次(每个字符串一次),但是如果使用较长的字符串集,这可能会变得效率低下且速度慢。
是否有内置的方法来搜索这样的多个字符串,还是应该创建自己的方法?
编辑:结果在!
在找到一些时间进行基准测试后,我发现RegEx方法确实比循环rangeInString
方法慢(比慢2倍)。您的选择的数字如下:
列出 150,000字(~1103,500个字符)和 20个匹配字, 5412匹配
NSString:rangeInString search = 231.077ms
正则表达式搜索= 530.113ms
答案 0 :(得分:4)
令我感到震惊的是,如果使用较长的字符串,这可能会变得效率低下且速度慢。
那么,你有基准吗?如果没有,那么你没有权利将其判断为“低效”和“慢”。过早优化是邪恶的。只需坚持使用那些简单易用的循环和- [NSString rangeOfString:]
方法。
但是:要真正回答您的问题,不能不可能以避免手动循环。如果您将NSRegularExpression
与good|great|awesome
这样的正则表达式一起使用,那么您可以在一次传递中找到所有匹配项。 然而,使用正则表达式可能比简单的字符串搜索慢。
答案 1 :(得分:1)
正则表达式被广泛使用,实现效率很高。具体来说,正则表达式匹配将遍历输入字符串一次。
NSRegularExpression *regex =
[NSRegularExpression regularExpressionWithPattern: @"(good|great|...)"
options: NSRegularExpressionCaseInsensitive
error: ...];
NSArray *matches = [regex matchesInString: string
options: 0
range: NSMakeRange(0, [string length])];
for (NSTextCheckingResult *match in matches)
...
这是一个测试片段:
NSString *string = @"not good nor great";
// as above
for (NSTextCheckingResult *match in matches)
NSLog (@"Match: %@", match);
产生
2013-08-22 10:21:11.644 foo[2454:707] Match: <NSSimpleRegularExpressionCheckingResult: 0x7fc954301650>{4, 4}{<NSRegularExpression: 0x7fc9543001c0> (good|great) 0x1}
2013-08-22 10:21:11.644 foo[2454:707] Match: <NSSimpleRegularExpressionCheckingResult: 0x7fc954301540>{13, 5}{<NSRegularExpression: 0x7fc9543001c0> (good|great) 0x1}
答案 2 :(得分:0)
是的,NSString内部是unichars的数据blob。您可以检索指向该部分的指针,然后让多个队列搜索它的一部分,但您必须确保划分空白字符以便错过两个范围的单词部分。