我有一个表示水果的字符串,用点分隔:
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
我需要检查这样的字符串是否包含指定的水果,所以给定上面的字符串和水果名称,说“浆果”,我想知道字符串包含“浆果”,当然它不应该告诉我是如果“浆果”不存在,但“草莓”是。
我想到的一个快速方法是:
componentsSeparatedByString
获取组件数组(带标签的水果名称)我不能只使用rangeOfString
的整个字符串,因为“berry”是“草莓”的子字符串,我甚至不能先获取组件然后检查每个组件的子字符串,因为标签可能与水果相同名。
我想知道有更好的办法吗?在内存占用和/或速度方面更好?
谢谢!
答案 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;
}