对NSString进行Tokenize以过滤数据(搜索)

时间:2014-10-22 17:53:54

标签: ios objective-c nsstring tokenize

我正在尝试为用于填充UITableView的数据源实施搜索过滤。

基本上,我试图让人们输入多个单词并将一个字符串拆分成标记,然后遍历数据源中的每个对象,看看我是否可以在对象属性中的任何位置找到所有搜索标记或子属性。

如果用户只是输入用空格分隔的多个单词,则使用-componentsSeparatedByString:这是一个简单的例子。

但是,我正在尝试解决用户可能放入以逗号分隔的项目列表的情况。

因此,标记化的简单输入是:

“word1 word2 word3”

我也希望能够对此进行标记:

“word1,word2,word3”

我看到的问题是,因为我不认为用户会输入逗号,所以我不能简单地替换/删除空格。

我看到了实现我想要的一些kludgy方法,它基本上包括首先在白色空间上拆分,然后迭代该数组,拆分逗号,然后迭代整个数组,删除“空”标记。我认为这样可行,但我希望有一种更优雅的方式来做到这一点,特别是因为我可能决定在某个时候添加第三个分隔符,这会使这个解决方案成倍增加。

到目前为止,我对将NSCharacterSet-componentsSeparatedByCharactersInSet结合使用感到好奇。不过,我在使用这种方法时遇到了麻烦。

这是我到目前为止所做的:

NSMutableCharacterSet *delimiters = [NSMutableCharacterSet characterSetWithCharactersInString:@","];
[delimiters addCharactersInString:@" "];
NSArray *tokens = [searchText componentsSeparatedByCharactersInSet:delimiters];

我遇到的问题是:

假设searchText(上面)是“单词”。在这种情况下,我的tokens数组变为:

[@"word", @""]

所以,即使尝试这一点,它(乍一看)似乎仍然需要迭代tokens数组来删除空项。同样,这是可能的,但我感觉有更好的方法。

有更好的方法吗?我误用了NSCharacterSet吗?

1 个答案:

答案 0 :(得分:2)

使用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
)