如何使用NSPredicate在字符串中以字开头?

时间:2010-08-28 09:41:13

标签: cocoa nsstring nspredicate

我正在寻找一种关于如何格式化NSPredicate以在一串文本中搜索正确单词的解决方案。 目前我正在使用此代码:

NSPredicate *predicate = [NSPredicate predicateWithFormat:
                          @"(content CONTAINS[c] %@)", word];

但是如果单词很短,它会返回错误的结果,例如: 如果单词是'ail',它将返回包含这3个字母的单词的所有字符串..但我不需要这样的抽象搜索,那么如何在字符串中搜索单词'beginwith'我的单词?

4 个答案:

答案 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]]];