"全字"通过NSPredicate在NSString中搜索

Dev*_*Dev 4 cocoa-touch core-data nsstring nspredicate nsfetchrequest

我想搜索属性description(NSString实例)中是否有给定的单词.

我试过这个谓词:

[NSPredicate predicateWithFormat:@"description CONTAINS[cd] %@", theWord];
Run Code Online (Sandbox Code Playgroud)

它有效,但它也找到了子词.

例如,给定theWord:

汽车

它也将是这个description:

圣诞颂歌

相反,我希望我的谓词只匹配a,或者christmas,或者carol.

(我正在使用Core Data和NSFetchRequest.)

Mon*_*olo 14

像这样的东西?

NSString *matchStr = @".*\\bCarol\\b.*";

NSPredicate *pred =[NSPredicate predicateWithFormat: @"description MATCHES %@", matchStr];

NSArray *arr = @[ 
    @"A Christmas Carol",
    @"Sing",
    @"Song"
];

NSArray *filtered = [arr filteredArrayUsingPredicate: pred];
Run Code Online (Sandbox Code Playgroud)

技巧是\b元字符,表示字符串中的字边界.为了使反斜杠"进入"正则表达式模式字符串,你必须在它之前加上另一个反斜杠,这样编译器才能理解字符串中应该有一个真正的反斜杠.因此字符串中的"\\ b".

另外,为了更好地覆盖非英语语言字符串,您应该通过设置w标志选项来启用Unicode字边界检测.匹配字符串将如下所示:

NSString *matchStr = @"(?w).*\\bCarol\\b.*"; 
Run Code Online (Sandbox Code Playgroud)

  • 如果你要在那里输入用户输入(比如`theWord`),我建议你去掉它.所以让`matchStr`就像`[NSString stringWithFormat:@".*\\ b%@ \\ b.*",[NSRegularExpression escapedPatternForString:theWord]]`.否则,如果用户输入"Car.*l",他们的输入将被视为正则表达式,如果它是无效的,则可能导致崩溃. (4认同)