NSString:检查字符串是否包含具有特殊格式的另一个字符串的最佳方法?

时间:2014-05-21 03:44:56

标签: ios objective-c algorithm nsstring substring

我有一个表示水果的字符串,用点分隔:

apple.orange.banana.watermelon

每个水果可能都有一个标签:

apple.orange.[old]banana.[juicy]watermelon

可能是部分重叠的水果名称:

apple.orange.[old]banana.[juicy]strawberry.[fresh]berry

标签也可以与水果名称相同:

apple.orange.[old]banana.[berry]strawberry.[fresh]berry

我需要检查这样的字符串是否包含指定的水果,所以给定上面的字符串和水果名称,说“浆果”,我想知道字符串包含“浆果”,当然它不应该告诉我是如果“浆果”不存在,但“草莓”是。

我想到的一个快速方法是:

  1. 使用componentsSeparatedByString获取组件数组(带标签的水果名称)
  2. 浏览每个组件,检查它是否有标签(即方括号),如果是,则将其删除
  3. 然后检查剩余的字符串是否是给定的水果名称
  4. 我不能只使用rangeOfString的整个字符串,因为“berry”是“草莓”的子字符串,我甚至不能先获取组件然后检查每个组件的子字符串,因为标签可能与水果相同名。

    我想知道有更好的办法吗?在内存占用和/或速度方面更好?

    谢谢!

1 个答案:

答案 0 :(得分:0)

有很多方法可以做到这一点。

可以使用正则表达式。

可以将字符串分成几部分。

但是,让我们注意到,当“浆果”(所需的水果)不是字符串中的第一个或最后一个水果时,它必须显示为]berry..berry.,如果“berry”是子串,那么这些都不匹配。

所以我们可以解决这个问题,只需在字符串的每一端放一个.,然后再搜索其中一种模式:

BOOL stringContainsFruit(NSString *string, NSString *fruit) {
    string = [NSString stringWithFormat:@".%@.", string];
    NSString *dotFruit = [NSString stringWithFormat:@".%@.", fruit];
    if ([string rangeOfString:dotFruit].location != NSNotFound) {
        return YES;
    }
    NSString *bracketFruit = [NSString stringWithFormat:@"]%@.", fruit];
    if ([string rangeOfString:bracketFruit].location != NSNotFound) {
        return YES;
    }
    return NO;
}