我正在寻找一种关于如何格式化NSPredicate以在一串文本中搜索正确单词的解决方案。 目前我正在使用此代码:
NSPredicate *predicate = [NSPredicate predicateWithFormat:
@"(content CONTAINS[c] %@)", word];
但是如果单词很短,它会返回错误的结果,例如: 如果单词是'ail',它将返回包含这3个字母的单词的所有字符串..但我不需要这样的抽象搜索,那么如何在字符串中搜索单词'beginwith'我的单词?
答案 0 :(得分:60)
只需使用BEGINSWITH
代替CONTAINS
。
修改强>
如果您需要搜索字符串的每个单词,有一种技术在WWDC 2010的其中一个演讲中提出。基本思想是创建一个单独的实体Word
,其中包含一个单词和包含对象(您正在搜索的实体)的引用。然后,您在Word
实体上执行搜索,并返回与找到的单词相关的对象。
查询将看起来像这样(假设您的实体与Word
之间存在多对一关系:“任何单词BEGINSWITH [c]%@”
这意味着您必须在创建对象时设置单词。
答案 1 :(得分:19)
首先用BEGINSWITH
搜索“Foo”,这会找到一个字符串的开头
"Foo Word1 Word2", "Foo OtherWord1 OtherWord2" (will find 2)
而不是CONTAINS
代表“Foo”(请注意Foo之前的空格),这将为您提供以“Foo”开头的单词并以空格开头
"Word1 Foo Word", "Some OtherWord FooWord", "Misc FooXWord" (will find 3)
谓词:
NSPredicate *predicate = [NSPredicate predicateWithFormat:
@"(content BEGINSWITH[c] %@) OR (content CONTAINS[c] %@)", word, [NSString stringWithFormat:@" %@", word]];
答案 2 :(得分:7)
如果您的文字在单词之间包含一些标点符号,则可以使用此谓词:
NSPredicate *predicate = [NSPredicate predicateWithFormat:
@"(name BEGINSWITH[c] %@) OR (name MATCHES[c] %@)",
query,
[NSString stringWithFormat:@".*[^\\w]%@.*", query]];
答案 3 :(得分:0)
尝试使用化合物:
NSCompoundPredicate *bPredicate = [NSCompoundPredicate orPredicateWithSubpredicates:@[[NSPredicate predicateWithFormat:@"content BEGINSWITH[cd] %@",_SearchBar.text], [NSPredicate predicateWithFormat:@"content CONTAINS[cd] %@", _SearchBar.text]]];