【问题标题】:Tokenize an NSString for filtering data (search)标记一个 NSString 以过滤数据(搜索)
【发布时间】:2014-10-22 17:53:54
【问题描述】:

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

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

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

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

所以,标记化的简单入口是这样的:

"word1 word2 word3"

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

"word1,word2,word3"

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

我看到了一些笨拙的方法来实现我想要的,这基本上包括首先在空白处分割,然后迭代该数组,分割逗号,然后迭代整个数组,删除“空”标记。我认为这会起作用,但我希望有一种更优雅的方式来做到这一点,尤其是因为我可能决定在某个时候添加第三个分隔符,这将使这个解决方案变得更加复杂。

到目前为止,我对将NSCharacterSet-componentsSeparatedByCharactersInSet 结合使用很感兴趣。不过,我在使用这种方法时遇到了问题。

这是我目前正在尝试的:

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

我遇到的问题是这样的:

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

[@"word", @""]

因此,即使尝试了这个,(乍一看)我仍然需要迭代 tokens 数组来删除空项目。同样,这是可能的,但我觉得有更好的方法。

有没有更好的方法?我是不是在滥用NSCharacterSet

【问题讨论】:

    标签: ios objective-c nsstring tokenize


    【解决方案1】:

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

    【讨论】:

    • 我会检查的。这看起来很有希望。如果成功了,我会回来接受这个答案。谢谢!!!!
    猜你喜欢
    • 1970-01-01
    • 2014-04-13
    • 2020-04-01
    • 2012-12-04
    • 1970-01-01
    • 1970-01-01
    • 2020-09-04
    • 1970-01-01
    • 2021-06-06
    相关资源
    最近更新 更多