2012-06-17 134 views
8

這必須是重複的。但是在那裏有很多NSPredicate問題,我找不到合適的問題。NSPredicate用字符串匹配起始字

我有一個包含compositeName字段的核心數據對象列表。像「艾米莉布朗特」這樣的名字可能在那裏。我想用NSPredicate來搜索這個列表,它可以讓我搜索「Em」,也可以搜索「Bl」,然後在獲取的結果中顯示這個名字。

這一定很容易,但正如你猜測的那樣,我沒有看到它。我在NSPredicate功能失調嘗試用正則表達式如下:

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

我對正則表達式的思想是:

  • 任意數目的字符之前
  • 負回顧後的空格或開始
  • 查詢
  • 任何數量的字符後

但它不工作。我沒有得到任何結果。我該如何解決?

P.S.如果沒有正則表達式的NSPredicate解決方案也適合我的目的。

+0

的可能重複(HTTP [「全字」在通過NSPredicate一個的NSString搜索]。 COM /問題/ 8559156 /整詞搜索-IN-A-的NSString-通nspredicate) – epologee

回答

16

您需要在謂詞字符串外部構建整個正則表達式模式字符串,然後將其傳遞給謂詞。

此外,還有一個正則表達式構造\b來匹配一個字邊界,這就是你所追求的。

這麼幹脆,這應該給你一個簡單的解決問題的方法:

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

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

如果輸入的搜索文本還沒有被清理,你可能會想這樣做之前,你把它傳遞給正則表達式引擎。

另一個改進可能是在字邊界處接受unicode字符以允許人們搜索'ntonio','Über'和其他類似字符串。

的下面幾行代碼將創建一個正則表達式模式,將帶的兩個方面護理://計算器:

NSString *orgSearchString = @"^"; 

NSString *escapedSearchString = [NSRegularExpression escapedPatternForString: orgSearchString]; 

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