2010-08-28 16 views
30

मैं टेक्स्ट की एक स्ट्रिंग में सही शब्द खोजने के लिए एनएसपीडिकेट को प्रारूपित करने के तरीके पर समाधान ढूंढ रहा हूं। वर्तमान में मैं इस कोड का उपयोग कर रहा हूँ:NSPredicate का उपयोग कर स्ट्रिंग में startwith word कैसे ढूंढें?

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

लेकिन यह गलत resuls वापस लौट आता है शब्द, कम है उदाहरण के लिए: अगर शब्द 'बीमार' है यह शब्द जो इस 3 अक्षरों में शामिल हैं के साथ सभी स्ट्रिंग्स वापस आ जाएगी। लेकिन मुझे इस तरह की अमूर्त खोज की आवश्यकता नहीं है, तो स्ट्रिंग में मेरे शब्द 'startwithwith' शब्द कैसे खोजें?

उत्तर

56

CONTAINS के बजाय बस BEGINSWITH का उपयोग करें।

संपादित

आप एक स्ट्रिंग के हर शब्द में खोज करने के लिए की जरूरत है, वहाँ एक तकनीक है जो WWDC 2010 में वार्ता में से एक में प्रस्तुत किया गया था मूल विचार एक अलग इकाई बनाने के लिए है है Word जो एक शब्द और युक्त वस्तु का संदर्भ (वह इकाई जिसे आप खोज रहे हैं) शामिल है। फिर आप Word इकाई पर खोज करते हैं और पाए गए शब्दों से संबंधित वस्तुओं को वापस कर देते हैं।

क्वेरी तो (कुछ इस तरह बशर्ते आप एक तो अपनी इकाई और Word के बीच कई-से-एक रिश्ता है दिखाई देगा: "किसी भी शब्द BEGINSWITH [सी]% @"

इसका मतलब यह होगा कि आप करने के लिए है कि शब्द सेटअप जब अपने वस्तुओं हालांकि बनाने।

+0

अपने समय के लिए धन्यवाद, लेकिन मैं एक स्ट्रिंग, नहीं एक शब्द के बारे में बात कर रहा हूँ। अगर मैं शुरूआत का उपयोग करूंगा तो यह मेरे शब्द से शुरू होने वाले सभी तारों को वापस कर देगा, लेकिन मुझे स्ट्रिंग्स लौटने की ज़रूरत है जिसमें शब्द शामिल हैं, मेरे शब्द से शुरू होता है ... – azia

+0

तो आपको जो कुछ चाहिए वह "एक्सएक्स के साथ सामग्री में कोई भी शब्द" ? – Alfonso

+0

हां, ऐसा कुछ। लेकिन यह पूरी स्ट्रिंग वापस करना चाहिए। चीज मुझे नुस्खा शीर्षक द्वारा सामग्री में से एक के साथ कोर डेटा व्यंजनों में खोजने की जरूरत है। उदाहरण के लिए यदि मैं सेब खोजता हूं तो मुझे 'फुजी एप्पल टार्टे टैटिन' शीर्षक के साथ व्यंजनों को खोजने की ज़रूरत है। – azia

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

6

हैं यह भविष्यवाणी:

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

वाह! मैंने सोचा कि टोकनिंग एकमात्र समाधान था जब तक मैंने इसे देखा नहीं। – 8suhas

+1

मैंने समाधान अद्यतन किया है। अब कोई विराम चिह्न की आवश्यकता नहीं है। –

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]]]; 
संबंधित मुद्दे