如何创建一个 NSPredicate 过滤给定范围内的所有字符,包括数字/数字?

Posted

技术标签:

【中文标题】如何创建一个 NSPredicate 过滤给定范围内的所有字符,包括数字/数字?【英文标题】:How to create a NSPredicate which filters all characters in given range including digits/numbers? 【发布时间】:2012-02-18 01:08:46 【问题描述】:

我想实现全文搜索,我要做的是:

NSString* start = @"a";
NSString* stop = [start stringByAppendingString:@"zzz"];
NSArray* range = [NSArray arrayWithObjects:[NSExpression expressionForConstantValue:start],[NSExpression expressionForConstantValue:stop],nil];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY keyword.word BETWEEN %@",range];

Start 是可变的,并且会根据我输入的内容而变化(即,如果我输入“cool”,则表示 start=@"cool",stop 将是 @"coolzzz")。

现在这很好用,直到我的输入是数字或数字并且 NSPredicate 不返回任何结果,即使有。

例如,在我的数据中,我有形状为 entry_name 1、entry_name 2 的条目。如果我输入 entry_name,我会得到所有结果,但是一旦我输入 entry_name 1,我就不会得到任何结果。

经过测试,我发现如果我只输入 1,我不会得到任何结果,因此 NSPredicate 不起作用。

如何编写一个过滤所有字符(包括数字)的 NSPredicate?

【问题讨论】:

【参考方案1】:

您不需要为 BETWEEN 运算符创建范围,一个简单的数组就足够了:

NSString* start = @"a";
NSString* stop = [start stringByAppendingString:@"zzz"];
NSPredicate *betweenPredicate = [NSPredicate predicateWithFormat: @"attributeName BETWEEN %@",
                                     [NSArray arrayWithObjects:start, stop, nil]];

另见Predicate Programming Guide

【讨论】:

【参考方案2】:
    NSString *searchText=@"string u want to search";

NSArray *range = [NSArray arrayWithObjects:@"entry_name 1",@"entry_name 2",@"entry_name 3",@"entry_name 4",@"entry_name5",nil];
NSMutableArray *match = [[NSMutableArray alloc] init];
for (int i=0; i<[range count];i++)

    NSString *sTemp = [range objectAtIndex:i] ;
    NSRange titleResultsRange = [sTemp rangeOfString:searchText options:NSCaseInsensitiveSearch];

    if (titleResultsRange.length > 0)
        [match addObject:sTemp];

 NSLog(@"match= %@",match);

 use above code for searching.

【讨论】:

以上是关于如何创建一个 NSPredicate 过滤给定范围内的所有字符,包括数字/数字?的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI Core Data - NSPredicate 动态过滤字符串数组属性包含给定字符串的位置

使用 NSPredicate 过滤数组的 NSDictionary

如何使用 NSPredicate 从另一个 NSMutableArray 中过滤 NSMutableArray

NSPredicate 在核心数据中的多对多关系

是否有一个 NSPredicate 来过滤具有一对多关系的模型(过滤多个)?

如何通过 NSPredicate 过滤 Core Data 托管对象?