2012-06-17 94 views
8

这必须是重复的。但是在那里有很多NSPredicate问题,我找不到合适的问题。NSPredicate用字符串匹配起始字

我有一个包含compositeName字段的核心数据对象列表。像“艾米莉布朗特”这样的名字可能在那里。我想用NSPredicate来搜索这个列表,它可以让我搜索“Em”,也可以搜索“Bl”,然后在获取的结果中显示这个名字。

这一定很容易,但正如你猜测的那样,我没有看到它。我在NSPredicate功能失调尝试用正则表达式如下:

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

我对正则表达式的思想是:

  • 任意数目的字符之前
  • 负回顾后的空格或开始
  • 查询
  • 任何数量的字符后

但它不工作。我没有得到任何结果。我该如何解决?

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

+0

的可能重复(HTTP [“全字”在通过NSPredicate一个的NSString搜索]。 COM /问题/ 8559156 /整词搜索-IN-A-的NSString-通nspredicate) – epologee

回答

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