2010-08-28 70 views
30

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

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

,但如果这个词是短暂的,例如,它会返回错误resuls: 如果字是“AIL”它会返回一个字,其中包括这3个字母的所有字符串。但我不需要这样的抽象搜索,所以如何在字符串中搜索单词“开始”我的单词?

回答

56

只需使用BEGINSWITH而不是CONTAINS

编辑

如果你需要在一个字符串的每一个字进行搜索,有这是在2010年WWDC会谈的一个呈现的技术的基本思想是创建一个单独的实体Word这包含单个单词和包含对象(您正在搜索的实体)的引用。然后,您在Word实体上执行搜索并返回与找到的单词有关的对象。

查询然后会是这个样子(只要你有你的实体和Word之间的多到一的关系:“任何言语BEGINSWITH [C]%@”

这意味着,你必须设置虽然创建对象时的话。

+0

谢谢你的时间,但我只是讲一个字符串,不发一言。如果我将使用开头,它将返回所有以我的单词开头的字符串,但是我需要返回包含单词的字符串,以我的单词开始... – azia 2010-08-29 12:59:44

+0

因此,您需要的内容类似于“内容中的任何单词以XX开头” ? – Alfonso 2010-08-30 06:10:08

+0

是的,这样的。但它应该返回整个字符串。事情是我需要找到核心数据食谱与食谱标题之一的成分。例如,如果我搜索苹果,我需要找到标题为'Fuji Apples Tarte Tatin'的食谱。 – azia 2010-08-30 07:15:05

18

搜索先用BEGINSWITH的“富”,这会找到你的字符串

"Foo Word1 Word2", "Foo OtherWord1 OtherWord2" (will find 2) 

的开端,比CONTAINS为“富”(不Ë美孚之前,与“富”开头的空间),它会给你的话主持了空间

"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]]; 
+1

这就是我想要的.. 不同的智能答案...谢谢你哥们 – guru 2016-02-16 07:28:26

6

如果您的文本包含您可以用文字之间的一些标点字符这个谓词:

NSPredicate *predicate = [NSPredicate predicateWithFormat: 
           @"(name BEGINSWITH[c] %@) OR (name MATCHES[c] %@)", 
           query, 
           [NSString stringWithFormat:@".*[^\\w]%@.*", query]]; 
+0

哇!直到我看到这一点时,我认为令牌化是唯一的解决方案。 – 8suhas 2015-01-09 18:38:28

+1

我已更新解决方案。现在不需要标点符号。 – 2015-01-10 21:01:26

7

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

NSString *matchString = [NSString stringWithFormat: @".*\\b%@.*",searchText]; 
NSString *predicateString = @"keyword MATCHES[c] %@"; 
NSPredicate *predicate =[NSPredicate predicateWithFormat: predicateString, matchString]; 
0

尝试使用化合物

NSCompoundPredicate *bPredicate =  [NSCompoundPredicate orPredicateWithSubpredicates:@[[NSPredicate predicateWithFormat:@"content BEGINSWITH[cd] %@",_SearchBar.text], [NSPredicate predicateWithFormat:@"content CONTAINS[cd] %@", _SearchBar.text]]]; 
相关问题