通过 NSPredicate 在 NSString 中搜索“整个单词”

Posted

技术标签:

【中文标题】通过 NSPredicate 在 NSString 中搜索“整个单词”【英文标题】:"Whole word" search in a NSString through NSPredicate 【发布时间】:2011-12-19 09:15:22 【问题描述】:

我想搜索属性descriptionNSString 实例)中是否有给定的单词。

我试过这个谓词:

[NSPredicate predicateWithFormat:@"description CONTAINS[cd] %@", theWord];

它可以工作,但它也能找到 子词

例如,给定theWord:

汽车

它也会这样description:

圣诞颂歌

相反,我希望我的谓词仅匹配 achristmascarol

(我正在使用 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使用正则表达式

NSPredicate 在 NSString 类型的两个日期之间进行过滤

NSPredicate 与 NSString 发生奇怪的崩溃

NSPredicate 与 NSString:查找超字符串哪个更好/更快?

ios 如何正确使用 NSPredicate 来匹配 Core Data 的 NSString?

iOS通过NSPredicate对NSArray进行过滤