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

3

我有一个表格视图,按人名属性显示行。该表格视图允许用户通过名称进行模糊搜索。例如,如果用户输入“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个回答

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];
}

0
通过去掉引号解决的问题:MATCHES %@而不是MATCHES '%@'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接