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”中键入,他们的输入将被视为正则表达式,如果输入无效,则可能导致崩溃。