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

时间:2012-02-18 01:08:46

标签: objective-c ios cocoa-touch nspredicate

我想实现全文搜索,我的工作是:

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来过滤所有字符,包括数字?

2 个答案:

答案 0 :(得分:1)

您无需为BETWEEN运算符创建范围,只需一个简单的数组:

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

另见Predicate Programming Guide

答案 1 :(得分:0)

    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.