2012-06-17 29 views
8

यह एक डुप्लिकेट होना चाहिए। लेकिन वहां इतने सारे एनएसपीडिकेट सवालों के साथ, मुझे सही नहीं मिल रहा है।शब्दों की शुरूआत की स्ट्रिंग मिलान के साथ एनएसपीडिकेट

मेरे पास कोर डेटा ऑब्जेक्ट्स की एक सूची है जिसमें compositeName फ़ील्ड है। 'एमिली ब्लंट' जैसे नाम वहां हो सकते हैं। मैं NSPredicate का उपयोग कर सूची खोजना चाहता हूं जो मुझे "एम" के लिए खोजेगा लेकिन "ब्लू" के लिए भी खोज करेगा और फिर यह नाम प्राप्त परिणामों में दिखाई देगा।

यह बहुत आसान होना चाहिए, लेकिन जैसा कि आप अनुमान लगाएंगे, मैं इसे नहीं देख रहा हूं। एक नियमित अभिव्यक्ति के साथ एक NSPredicate मेरी बेकार प्रयास इस तरह दिखता है:

[NSPredicate predicateWithFormat:@"compositeName MATCHES[cd] '.*(?<=^|\\s)%@.*'", query]; 

इस नियमित अभिव्यक्ति के लिए मेरे बारे में सोचा थे:

  • से पहले
  • नकारात्मक lookbehind रिक्त स्थान है वर्णों की संख्या या शुरुआत
  • क्वेरी
के बाद वर्णों की संख्या

लेकिन यह काम नहीं कर रहा है। मुझे कोई परिणाम नहीं मिल रहा है। मैं यह कैसे तय करुं?

पीएस यदि नियमित अभिव्यक्तियों के बिना एक एनएसपीडिकेट समाधान है जो मेरे उद्देश्य के अनुरूप भी होगा।

+0

के संभावित डुप्लिकेट (http [ "पूरे शब्द" NSPredicate के माध्यम से एक NSString खोज]। com/प्रश्न/8559156/पूर्ण शब्दों-खोज-में-एक-NSString-थ्रू-nspredicate) – epologee

उत्तर

16

आपको भविष्य की स्ट्रिंग के बाहर पूरी रेगेक्स पैटर्न स्ट्रिंग बनाने की आवश्यकता है, फिर इसे भविष्य में पास करें।

इसके अलावा, एक शब्द सीमा से मेल खाने के लिए \b का एक रेगेक्स निर्माण होता है, जो आप के बाद होते हैं।

तो कुल मिलाकर, इस आप अपनी समस्या के लिए एक सरल उपाय देना चाहिए:

NSString *searchString = @"Em"; 
NSString *regexString = [NSString stringWithFormat:@".*\\b%@.*", searchString]; 

NSPredicate *pred = [NSPredicate predicateWithFormat:@"self.compositeName matches[cd] %@", regexString]; 

इनपुट खोज पाठ से साफ नहीं किया गया है, आप क्या करना चाहते हो सकता है कि इससे पहले कि आप regex इंजन को भेज देगा ।

एक और सुधार शब्द सीमा पर यूनिकोड वर्णों को स्वीकार करने के लिए किया जा सकता है जिससे लोगों को 'एंटोनियो', 'Über' और अन्य समान तारों की खोज करने की अनुमति मिल सके।

कोड के निम्नलिखित लाइनों एक regex पैटर्न है कि दोनों पहलुओं का ध्यान रखना होगा पैदा करेगा: // stackoverflow:

NSString *orgSearchString = @"^"; 

NSString *escapedSearchString = [NSRegularExpression escapedPatternForString: orgSearchString]; 

NSString *regexString = [NSString stringWithFormat:@"(?w:).*\\b%@.*", escapedSearchString];