如何使用非字母字符的firstName过滤NSMutableArray

时间:2013-12-12 09:44:44

标签: ios iphone objective-c core-data ios5

我想过滤数组,其中name以非字母字符开头。我想在表视图的不同部分下显示firstName以非字母字符开头的联系人。我尝试下面的代码,但它崩溃了,请找到下面的原因:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NOT(firstName BEGINSWITH[c] %@)",arrIndex]; //where arrIndex is the array of alphabetical characeters.
  NSArray  *arrContacts = [arrayTotalContacts filteredArrayUsingPredicate:predicate];

由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'无法对不是字符串的内容执行子字符串操作(lhs = iPhone rhs =(     一个,     B,     C,     d,     E,     F,     G,     H,     一世,     Ĵ,     K,     L,     男,     N,     O,     P,     Q,     R,     S,     T,     U,     V,     W,     X,     Y,     ž ))'

arrayTotalContacts具有以下数据:

(
{
    firstName = iPhone;
    lastName = "";
},
{
    firstName = Madhu;
    lastName = "";
},
{
    firstName = "Swa";
    lastName = "";
},
{
    firstName = TechV;
    lastName = "";
},
{
    firstName = Vedika;
    lastName = Vt;
}
)

2 个答案:

答案 0 :(得分:2)

您可以将正则表达式与Core Data谓词一起使用:

[NSPredicate predicateWithFormat:@"NOT (firstName MATCHES %@)", @"^[A-Za-z].*"]

其中^[A-Za-z].*是所有以A-Z或a-z开头的字符串的正则表达式。 为了使其能够使用外语字母(例如“Ä”),请使用 Unicode属性名称:

[NSPredicate predicateWithFormat:@"NOT(firstName MATCHES %@)", @"^\\p{Letter}.*"]

此处^\\p{Letter}.*是以字母开头的所有字符串的正则表达式。

但如果这是用于表视图,则最好使用获取的结果控制器 及其sectionNameKeyPath参数。例如,见:

有关如何根据首字母对表视图进行分组的示例。它应该是 可以修改代码以将所有不以字母开头的名称分组 一个单独的小组。

答案 1 :(得分:0)

试试这个,

NSArray * arrContacts = [arrayTotalContacts  valueForKeyPath:@"firstName"];

希望有所帮助:)