Cocoa touch &引用;全字;通过NSPredicate在NSString中搜索
我想搜索属性Cocoa touch &引用;全字;通过NSPredicate在NSString中搜索,cocoa-touch,core-data,nsstring,nspredicate,nsfetchrequest,Cocoa Touch,Core Data,Nsstring,Nspredicate,Nsfetchrequest,我想搜索属性description(一个NSString实例)中是否有给定的单词 我试着用这个谓词: [NSPredicate predicateWithFormat:@"description CONTAINS[cd] %@", theWord]; 它可以工作,但也可以找到子单词 例如,给定单词: 汽车 它还将显示此说明: 圣诞颂歌 相反,我希望我的谓词只匹配a,或christmas,或carol (我使用的是核心数据和NSFetchRequest。)类似的东西 NSString *matc
description
(一个NSString
实例)中是否有给定的单词
我试着用这个谓词:
[NSPredicate predicateWithFormat:@"description CONTAINS[cd] %@", theWord];
它可以工作,但也可以找到子单词
例如,给定单词:
汽车
它还将显示此说明
:
圣诞颂歌
相反,我希望我的谓词只匹配a
,或christmas
,或carol
(我使用的是核心数据和NSFetchRequest。)类似的东西
NSString *matchStr = @".*\\bCarol\\b.*";
NSPredicate *pred =[NSPredicate predicateWithFormat: @"description MATCHES %@", matchStr];
NSArray *arr = @[
@"A Christmas Carol",
@"Sing",
@"Song"
];
NSArray *filtered = [arr filteredArrayUsingPredicate: pred];
诀窍是\b
元字符,它表示字符串中的单词边界。为了将反斜杠“插入”正则表达式模式字符串,必须在其前面加上另一个反斜杠,以便编译器理解字符串中应该有一个真正的反斜杠。因此字符串中有“\\b”
另外,为了更好地覆盖非英语语言字符串,您应该通过设置w
标志选项来启用Unicode单词边界检测。匹配字符串如下所示:
NSString *matchStr = @"(?w).*\\bCarol\\b.*";
如果您要将用户输入放在那里(比如单词
),我建议您将其转义。因此,使匹配str
类似于[NSString stringWithFormat:@.*\\b%@\\b.*,[NSRegularExpression escapedpattern forstring:theWord]
。否则,如果用户在“Car.*l”中键入,他们的输入将被视为正则表达式,如果输入无效,则可能导致崩溃。