如何创建一个 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