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

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

我试过这个谓词:

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

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

例如,给定theWord:

汽车

它也会这样description:

圣诞颂歌

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

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

【问题讨论】:

    标签: cocoa-touch core-data nsstring nspredicate 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”,他们的输入将被视为正则表达式,如果输入无效则可能导致崩溃。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-26
    • 1970-01-01
    • 2013-09-15
    相关资源
    最近更新 更多