如何使用NSPredicate从数组中选择一个精确的短语?

Jon*_*nah 5 objective-c filter nspredicate ios

我使用NSPredicate通过州和国家列表过滤NSDictionary.

所有数据都以逗号分隔的数组存储:@"Alabama",@"Alaska",@"Arizona",@"Arkansas",@"California",@"Colorado"等

但是,有两种情况发生重复.州"新墨西哥州"包含"墨西哥"一词,"阿肯色州"包含"堪萨斯州"一词.

这是我用来定义谓词的基本代码.

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"Location contains[c] %@", @"Kansas"];
Run Code Online (Sandbox Code Playgroud)

我如何确保"堪萨斯"不会返回"阿肯色州"的物品?使用BEGINSWITH或LIKE不起作用,因为列表以其他状态开头.

谢谢!

Leo*_*ica 4

让我们看看我的理解是否正确。您有一本字典,其中有一个键“Location”,其对象是一个以逗号分隔的州名称的字符串。听起来你需要一个正则表达式来匹配。

NSString* expr = [NSString stringWithFormat:@"^%1$@.*|.*, %1$@.*", @"Kansas"]  
NSPredicate* predicate = [NSPredicate predicateWithFormat:@"Location MATCHES[c] %@", expr];
Run Code Online (Sandbox Code Playgroud)

现在,以下是它在不同示例中的表现:

@{@"Location": @"Kansas, Arkansas, Alabama"} //Pass
@{@"Location": @"Alabama, Kansas"} //Pass
@{@"Location": @"Arkansas, Alabama"} //Fail
Run Code Online (Sandbox Code Playgroud)

正则表达式^%1$@.*|.*, %1$@.*测试提供的单词是否位于字符串的开头或后跟字符和“,”(将其放在中间)。%1$@采用第一个参数,以便可以多次使用它,而不是多次提供相同的字符串。