2011-12-19 51 views
3

如果在屬性descriptionNSString實例)中有一個給定單詞,我想搜索該單詞。通過NSPredicate在「NSString」中搜索「整個單詞」

我試着用這個謂詞:

[NSPredicate predicateWithFormat:@"description CONTAINS[cd] %@", theWord]; 

它的工作原理,但它也發現子字

例如,假設theWord

汽車

它也將馬赫這個description

聖誕頌歌

相反,我想我的謂詞將僅匹配achristmascarol

(我正在使用Core Data和NSFetchRequest。)

回答

13

是這樣的嗎?

NSString *matchStr = @".*\\bCarol\\b.*"; 

NSPredicate *pred =[NSPredicate predicateWithFormat: @"description MATCHES %@", matchStr]; 

NSArray *arr = @[ 
    @"A Christmas Carol", 
    @"Sing", 
    @"Song" 
]; 

NSArray *filtered = [arr filteredArrayUsingPredicate: pred]; 

訣竅是\b元字符,它表示字符串中的字邊界。爲了將反斜槓「轉換」爲「正則表達式」模式字符串,必須在其前面加上另一個反斜槓,以便編譯器明白字符串中應該有一個真正的反斜槓。因此字符串中的「\\ b」。

此外,爲了更好地覆蓋非英語語言字符串,您應該通過設置w標誌選項來啓用Unicode字邊界檢測。匹配字符串將如下所示:

NSString *matchStr = @"(?w).*\\bCarol\\b.*"; 
+3

如果您打算將用戶輸入(例如'theWord'),我建議將其轉義。因此,使'matchStr'類似'[NSString stringWithFormat:@「。* \\ b%@ \\ b。*」,[NSRegularExpression escapedPatternForString:theWord]]''。否則,如果用戶鍵入「Car。* l」,則它們的輸入將被視爲正則表達式,並且如果它是無效的,則可能導致崩潰。 – 2014-07-22 15:13:34