RegEx:如何在NSPredicate中使用正则表达式?

时间:2013-05-10 03:22:18

标签: ios regex nspredicate

我有一个表视图按人名属性显示行。表视图允许用户通过名称进行繁琐的搜索。例如如果用户输入'crp',它将匹配名称'Chris Paul'。

我有一个方法,它采用搜索字符串并设置NSPredicate来搜索数组中的模型名称

- (void)setPredicateWithText: (NSString *)searchText
{

    for (int i = 0; i < searchText.length; i ++)
    {
        NSString *character = [searchText substringWithRange:NSMakeRange(i, 1)];
        self.format = [self.format stringByAppendingFormat:@".*%@",character];

        if (i == searchText.length -1) // last character
        {
          self.format = [self.format stringByAppendingString:@".*"];
        }
    }
    // result format == .*c.*r.*p.*
    self.searchPredicate = [NSPredicate predicateWithFormat:@"SELF.name MATCHES '%@'", self.format];
}

以及其他方法:

 self.resultArray = [self.allPlayers filteredArrayUsingPredicate:self.searchPredicate];

但结果没有回来......请帮助我,谢谢!!

2 个答案:

答案 0 :(得分:5)

解决问题

您应该在代码中更改两件事,

1)将'%@'替换为%@

2)添加[c]忽略区分大小写


谓词应该是这样的

[NSPredicate predicateWithFormat:@"SELF.name MATCHES [c] %@", self.format];

最后的方法,

- (void)setPredicateWithText: (NSString *)searchText
{

    for (int i = 0; i < searchText.length; i ++)
    {
        NSString *character = [searchText substringWithRange:NSMakeRange(i, 1)];
        self.format = [self.format stringByAppendingFormat:@".*%@",character];

        if (i == searchText.length -1) // last character
        {
            self.format = [self.format stringByAppendingString:@".*"];
        }
    }
    // result format == .*c.*r.*p.*
    self.searchPredicate = [NSPredicate predicateWithFormat:@"SELF.name MATCHES [c] %@", self.format];
}

答案 1 :(得分:0)

通过删除引号解决问题:MATCHES %@而不是MATCHES '%@'