ios - 标记 NSString 以过滤数据(搜索)

标签 ios objective-c nsstring tokenize

我正在尝试对用于填充 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/

相关文章:

ios - 从本地联系人复制号码会产生奇怪的结果

objective-c - 测量 cocoa 中的绳子高度

ios - 将数据传递给下一个 ViewController 时出错

ios - 80 年代的 4 月 1 日日期在 iOS 10.0 中无法解析

ios - 无法在 Swift 中使用范围方法之外的变量(dataTaskWithRequest)

objective-c - 如何交换big 到主机int8 数字?

ios - touchesBegan 方法的问题

ios - iOS 中的 Sqlite 数据库锁定问题

iphone - 如果滚动过去,则将UITableView的值存储在NSString中

ios - 制作 UIProgressView 圆角