NSPredicate,字符串匹配单词的开头

时间:2012-06-17 12:58:23

标签: regex core-data nspredicate foundation

这必须是重复的。但由于存在如此多的NSPredicate问题,我找不到合适的问题。

我有一个包含compositeName字段的Core Data对象列表。像'Emily Blunt'这样的名字就在那里。我想使用NSPredicate搜索列表,让我搜索“Em”,但也搜索“Bl”,然后在获取的结果中显示此名称。

这一定非常简单,但正如你猜测的那样,我没有看到它。我在使用正则表达式的NSPredicate中的不正常尝试看起来像这样:

[NSPredicate predicateWithFormat:@"compositeName MATCHES[cd] '.*(?<=^|\\s)%@.*'", query];

我对这个正则表达式的想法是:

  • 之前的任意数量的字符
  • 负面的后方空间或开始
  • 查询
  • 之后的任意数量的字符

但它不起作用。我没有得到任何结果。我该如何解决这个问题?

P.S。如果有一个没有正则表达式的NSPredicate解决方案也适合我的目的。

1 个答案:

答案 0 :(得分:16)

您需要在谓词字符串之外构建整个正则表达式模式字符串,然后将其传递给谓词。

此外,还有一个正则表达式构造\b来匹配单词边界,这就是你所追求的。

总而言之,这段代码应该为您提供一个解决问题的简单方法:

NSString *searchString = @"Em";
NSString *regexString  = [NSString stringWithFormat:@".*\\b%@.*", searchString];

NSPredicate *pred = [NSPredicate predicateWithFormat:@"self.compositeName matches[cd] %@", regexString];

如果尚未清除输入搜索文本,您可能希望在将其传递给正则表达式引擎之前执行此操作。

另一个改进可能是在字边界接受unicode字符,以便人们搜索'Ántonio','Über'和其他类似的字符串。

以下代码行将创建一个正则表达式模式,它将处理这两个方面:

NSString *orgSearchString = @"^";

NSString *escapedSearchString = [NSRegularExpression escapedPatternForString: orgSearchString];

NSString *regexString  = [NSString stringWithFormat:@"(?w:).*\\b%@.*", escapedSearchString];