在NSString中搜索多个字符串

时间:2013-08-22 15:59:45

标签: iphone ios objective-c string nsstring

在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

3 个答案:

答案 0 :(得分:4)

  

令我感到震惊的是,如果使用较长的字符串,这可能会变得效率低下且速度慢。

那么,你有基准吗?如果没有,那么你没有权利将其判断为“低效”和“慢”。过早优化是邪恶的。只需坚持使用那些简单易用的循环和- [NSString rangeOfString:]方法。


但是:要真正回答您的问题,不能不可能以避免手动循环。如果您将NSRegularExpressiongood|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。您可以检索指向该部分的指针,然后让多个队列搜索它的一部分,但您必须确保划分空白字符以便错过两个范围的单词部分。