我正在尝试为用于填充UITableView
的数据源实现搜索过滤。
基本上,我试图允许人们输入多个单词,并将一个字符串拆分为标记,然后遍历数据源中的每个对象,看看我是否可以在对象的属性或子属性中的任何位置找到所有搜索标记。
如果用户只是简单地键入用空格分隔的多个单词,那么这是使用-componentsSeparatedByString:
的一个微不足道的情况。
然而,我也在尝试解决用户可能放入逗号分隔的项目列表的情况。
因此,标记化的简单入口是:
"word1 word2 word3"
我也想能够标记这个:
"单词1,单词2,单词3"
我看到的问题是,因为我不认为用户会输入逗号,所以我不能简单地替换/删除空白。
我看到了一些实现我想要的东西的笨拙方法,基本上包括首先在空白处进行拆分,然后迭代该数组,在逗号上进行拆分,再迭代整个数组,删除"空"标记。我认为这会起作用,但我希望有一种更优雅的方法来做到这一点,特别是因为我可能会决定在某个时候添加第三个分隔符,这将使这个解决方案变得更加复杂。
到目前为止,我对将NSCharacterSet
与-componentsSeparatedByCharactersInSet
结合使用很感兴趣。不过,我对这种方法有意见。
以下是我目前正在尝试的:
NSMutableCharacterSet *delimiters = [NSMutableCharacterSet characterSetWithCharactersInString:@","];
[delimiters addCharactersInString:@" "];
NSArray *tokens = [searchText componentsSeparatedByCharactersInSet:delimiters];
我遇到的问题是:
假设searchText
(上图)是"单词,"。在这种情况下,我的tokens
数组变成这样:
[@"word", @""]
因此,即使尝试了这种方法,(乍一看)我仍然需要迭代tokens
数组来删除空项。再说一遍,这是可能的,但我觉得还有更好的方法。
有更好的方法吗?我是否滥用NSCharacterSet
?
使用enumerateSubstringsInRange:options:usingBlock:,并将NSStringEnumerationByWords作为选项传递。这将把字符串分隔成单独的单词,并去掉任何空格、逗号、分号等。例如,这个代码,
- (void)viewDidLoad {
[super viewDidLoad];
NSMutableArray *words = [NSMutableArray new];
NSString *text = @"these are , some, words with commas; semi colons: colons and period.";
[text enumerateSubstringsInRange:NSMakeRange(0, text.length) options:NSStringEnumerationByWords usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
[words addObject:substring];
}];
NSLog(@"%@", words);
}
给出这个输出,
2014-10-22 11:13:25.728 GettingWordsFromStringProblem[859:270592] (
these,
are,
some,
words,
with,
commas,
semicolons,
colons,
and,
period
)