我正在尝试对用于填充 UITableView
的数据源实现搜索过滤。
基本上,我试图让人们输入多个单词并将一个字符串拆分为标记,然后遍历数据源中的每个对象,看看我是否可以在对象属性的任何位置找到所有搜索标记,或者子属性。
如果用户只是简单地输入由空格分隔的多个单词,这是使用 -componentsSeparatedByString:
的简单情况。
不过,我也在尝试解决用户可能输入以逗号分隔的项目列表的情况。
因此,标记化的简单入口是:
“字1字2字3”
我也希望能够标记这个:
“单词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
)
关于ios - 标记 NSString 以过滤数据(搜索),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26513917/