iOS:如何从搜索字符串中删除无效字符,同时允许搜索多个单词

Dav*_*nte 1 search full-text-search ios

这是对这个问题的后续问题.

感谢Nick Lockwood,我可以使用此代码来过滤不良字符:

NSString *safeSearchString = [[searchString componentsSeparatedByCharactersInSet:[[NSCharacterSet alphanumericCharacterSet] invertedSet]] componentsJoinedByString:@""];
Run Code Online (Sandbox Code Playgroud)

但是,我有像"我,你"或"这不是那个"的字符串.

我希望能够搜索"你"或"那个".

上面的代码似乎限制了我太多,我只能搜索特殊字符的单词.

我可以帮忙吗?

更新:

我试过使用这段代码:

NSString *badChars = @"\\\'";
NSCharacterSet *badCharSet = [NSCharacterSet characterSetWithCharactersInString: badChars];
NSString *safeSearchString = [sbar.text stringByTrimmingCharactersInSet:badCharSet];
Run Code Online (Sandbox Code Playgroud)

但没有快乐..请原谅所有新手问题......

第二次更新:

我也试过这个代码.这是一个委托方法:

- (BOOL)searchBar:(UISearchBar *)searchBar shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
    if ((text == @"\\") || (text == @"\'")) {
        return NO;      
    } else {
        return YES;
    }
}
Run Code Online (Sandbox Code Playgroud)

它几乎可以工作,但不能在谓词检查中存活:"无法解析格式字符串"main包含[cd]'不是'或解释包含[cd]'不是'或者摘要包含[cd]'isn' t'或数据包含[cd]'不是'''...

jon*_*oll 6

我不确定你明白你的例子中的代码是做什么的.该代码的作用是:

  1. 创建一组所有字母数字字符
  2. 创建该集的反转(即所有非字母数字字符)
  3. 将原始字符串分解为子字符串数组,由非字母数字字符集中的任何字符分隔
  4. 将该数组中的子串重新组合成一个字符串作为最终结果

最终结果是您的原始字符串减去任何非字母数字字符.所以如果你的原始searchString是这样的:

This isn't the one
Run Code Online (Sandbox Code Playgroud)

然后你的safeSearchString将是:

Thisisnttheone
Run Code Online (Sandbox Code Playgroud)

我想这可能不是你想要的.我不确切知道你在做什么的背景,但我可以给出一些可能有帮助的想法:

如果您只想从字符串中删除某些非法字符而不是所有非字母数字,您可以创建一个自定义字符集,如下所示:

// remove only apostrophe and dollar sign characters
NSCharacterSet *charSet = [NSCharacterSet characterSetWithCharactersInString:@"'$"];
NSString *safeSearchString = [[searchString componentsSeparatedByCharactersInSet:charSet] componentsJoinedByString:@""];
Run Code Online (Sandbox Code Playgroud)

如果要删除所有非字母数字字符但保留空格:

// remove any characters except alphanumeric and space
NSMutableCharacterSet *charSet = [NSMutableCharacterSet characterSetWithCharactersInString@" "];
[charset formUnionWithCharacterSet:[NSCharacterSet alphanumericCharacterSet]];
NSString *safeSearchString = [[searchString componentsSeparatedByCharactersInSet:charSet] componentsJoinedByString:@""];
Run Code Online (Sandbox Code Playgroud)

您可能还想删除非字母数字/非空格字符,然后分成单个单词的数组:

NSString * searchString = @"This isn't the one";  // example

// remove any characters except alphanumeric and space and break into an array on word boundaries
NSMutableCharacterSet *charSet = [NSMutableCharacterSet characterSetWithCharactersInString@" "];
[charset formUnionWithCharacterSet:[NSCharacterSet alphanumericCharacterSet]];
NSString *safeSearchString = [[searchString componentsSeparatedByCharactersInSet:charSet] componentsJoinedByString:@""];
NSArray *safeSearchWords = [safeSearchString componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];

NSString *word;
for (word in safeSearchWords) {
    NSLog(@"%@",word);
}

// This
// isnt
// the
// one
Run Code Online (Sandbox Code Playgroud)