2014-02-16 51 views
0

我有一個NSArray的5個NSArrays,每個包含NSDictionaries。字典只包含字符串。我試圖使用NSPredicate來過濾特定的字典,但它似乎只能用於完全匹配。我想讓它忽略任何標點符號,如:-。這是我目前的。使用NSPredicate不精確/類似匹配過濾NSArray?

NSString *seriesTitle = @" Fullmetal Alchemist Brotherhood - "; 
NSPredicate *titlePredicate = [NSPredicate predicateWithFormat: 
            @"series_title CONTAINS[cd]%@", seriesTitle]; 
NSArray *filtered = [arraytoEvaluate filteredArrayUsingPredicate:titlePredicate] 

「arraytoEvaluate」是包含此鍵值對@"series_title" : @"Fullmetal Alchemist: Brotherhood"的NSDictionary。這是我希望它匹配的那個。即使我請求[cd]搜索,我認爲它忽略了標點符號/空格,但我的謂詞不會提取它嗎?

使用series_title LIKE[cd]%@使我這個崩潰:

'NSInvalidArgumentException', reason: 'Can't do regex matching on object

使用BEGINSWITH而是給了我這樣的: 'NSInvalidArgumentException', reason: 'Can't do a substring operation with something that isn't a string

如果我在字符串中傳遞準確,就會把它撿起來,並給我包含包含匹配字典的數組,但只有當搜索條件完全匹配時。

此外,它會給我所有的人,而不是包含單個NSDictionary包含匹配的NSArray。我不知道該怎麼做。我知道filteredArrayUsingPredicate應該返回一個數組,但是我需要遍歷該數組以獲得包含搜索項匹配的特定NSDictionary。然而,這是次要問題。任何幫助將不勝感激。

回答

3

你有兩個問題:(a)匹配錯誤;(b)你有嵌套數組。

(a)[cd]表示忽略大小寫和變音符號,而不是標點和空格。這裏的一個解決方案是使用正則表達式和MATCHES[CD]作爲謂詞。你需要一個正則表達式來匹配你正在尋找的術語。一個基本的再是:

@"fullmetal[^a-z]*alchemist[^a-z]*brotherhood" 

其中[^a-z]*匹配零個或多個(*)字符從每個字符這不是(^)的信a-z的設定[...]

雖然這可行,但它可能比您想要的要多得多 - 您應該改進正則表達式。

(b)您得到的錯誤Can't do regex matching on object...是因爲您無法將正則表達式與數組匹配,並且數組中的元素本身就是數組。您可以通過在元素上一個簡單的循環,東西線沿線的解決這個問題:

NSMutableArray *filtered = [NSMutableArray new];           // allocate an empty mutable array in which to accumulate the matches 
for(NSArray *subArray in arraytoEvaluate)             // loop over each sub array 
    [filtered addObjectsFromArray:[subArray filteredArrayUsingPredicate: titlePredicate]]; // and perform the predicate 

HTH

+0

好,我看到這是如何工作的。我只有一個問題。我只用'NSString * seriesTitle = @「鋼之鍊金術師兄弟會 - 」;'作爲這個問題的一個例子,但實際上搜索字符串會有所不同。如何在這種情況下設置正則表達式字符串?我可以做'NSString * regex = @「[^ a-z] * [^ a-z] *」;'但是輸入字符串在哪裏起作用?謝謝。 –

+0

@JosephToronto - 你必須設計一個算法來構造一個正則表達式,使其與你需要的靈活性相匹配。例如。如果你匹配一系列的單詞,而不管介入的空格或標點符號,那麼你的算法可能是提取這些單詞,然後將它們與一個匹配空格和標點符號的模式相結合 - 這實際上就是我用你的例子只用手加入模式是*非常*一般! – CRD