通过 NSPredicate 在 NSString 中搜索“整个单词”
Posted
技术标签:
【中文标题】通过 NSPredicate 在 NSString 中搜索“整个单词”【英文标题】:"Whole word" search in a NSString through NSPredicate 【发布时间】:2011-12-19 09:15:22 【问题描述】:我想搜索属性description
(NSString
实例)中是否有给定的单词。
我试过这个谓词:
[NSPredicate predicateWithFormat:@"description CONTAINS[cd] %@", theWord];
它可以工作,但它也能找到 子词。
例如,给定theWord
:
汽车
它也会这样description
:
圣诞颂歌
相反,我希望我的谓词仅匹配 a
、christmas
或 carol
。
(我正在使用 Core Data 和 NSFetchRequest。)
【问题讨论】:
【参考方案1】:这样的?
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.*";
【讨论】:
如果您要将用户输入放在那里(如theWord
),我建议您转义它。所以让matchStr
类似于[NSString stringWithFormat:@".*\\b%@\\b.*", [NSRegularExpression escapedPatternForString:theWord]]
。否则,如果用户输入“Car.*l”,他们的输入将被视为正则表达式,如果输入无效则可能导致崩溃。以上是关于通过 NSPredicate 在 NSString 中搜索“整个单词”的主要内容,如果未能解决你的问题,请参考以下文章
NSPredicate 在 NSString 类型的两个日期之间进行过滤
NSPredicate 与 NSString 发生奇怪的崩溃
NSPredicate 与 NSString:查找超字符串哪个更好/更快?