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

epo*_*gee 8 regex core-data foundation nspredicate

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

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

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

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

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

  • 以前任意数量的字符
  • 消极的观察空间或开始
  • 查询
  • 之后的任意数量的字符

但它不起作用.我没有得到任何结果.我该如何解决?

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

Mon*_*olo 16

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

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

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

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

NSPredicate *pred = [NSPredicate predicateWithFormat:@"self.compositeName matches[cd] %@", regexString];
Run Code Online (Sandbox Code Playgroud)

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

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

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

NSString *orgSearchString = @"^";

NSString *escapedSearchString = [NSRegularExpression escapedPatternForString: orgSearchString];

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