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

azi*_*zia 35 cocoa nsstring nspredicate

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

NSPredicate *predicate = [NSPredicate predicateWithFormat:
                          @"(content CONTAINS[c] %@)", word];
Run Code Online (Sandbox Code Playgroud)

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

Alf*_*nso 62

只需使用BEGINSWITH而不是CONTAINS.

编辑

如果您需要搜索字符串中的每个单词,则有一种技术在WWDC 2010的其中一个演讲中呈现.基本思想是创建一个单独的实体Word,其中包含单个单词和包含对象的引用(你正在搜索的实体).然后,您对Word实体执行搜索并返回与找到的单词相关的对象.

然后查询看起来像这样(前提是你的实体之间有多对一的关系Word:"任何单词BEGINSWITH [c]%@"

这意味着您必须在创建对象时设置单词.


Pet*_*isu 21

首先搜索BEGINSWITH"Foo",这将找到一个字符串的开头

"Foo Word1 Word2", "Foo OtherWord1 OtherWord2" (will find 2)
Run Code Online (Sandbox Code Playgroud)

而不是CONTAINS"Foo"(请注意Foo之前​​的空格),它将为您提供以"Foo"开头的单词,并以空格为主题

"Word1 Foo Word", "Some OtherWord FooWord", "Misc    FooXWord" (will find 3)
Run Code Online (Sandbox Code Playgroud)

谓词:

NSPredicate *predicate = [NSPredicate predicateWithFormat:
                          @"(content BEGINSWITH[c] %@) OR (content CONTAINS[c] %@)", word, [NSString stringWithFormat:@" %@", word]];
Run Code Online (Sandbox Code Playgroud)


Man*_*lan 8

如果您的文本在单词之间包含一些标点符号,则可以使用此谓词:

NSPredicate *predicate = [NSPredicate predicateWithFormat:
                              @"(name BEGINSWITH[c] %@) OR (name MATCHES[c] %@)", 
                              query,
                              [NSString stringWithFormat:@".*[^\\w]%@.*", query]];
Run Code Online (Sandbox Code Playgroud)


Bru*_*niz 7

我有同样的问题,起初我认为你的答案可以帮助我,但他们没有.这一个对我有帮助,所以...看一看:

NSString *matchString =  [NSString stringWithFormat: @".*\\b%@.*",searchText];
NSString *predicateString = @"keyword MATCHES[c] %@";
NSPredicate *predicate =[NSPredicate predicateWithFormat: predicateString, matchString];
Run Code Online (Sandbox Code Playgroud)