NSPredicate检查由逗号分隔的数字串是否包含数字

时间:2016-01-04 07:02:32

标签: ios objective-c iphone ipad nspredicate

我有一个字符串说,' 0,1,2,3,4,5,6,7,8,9,10,11' (假设是月份索引字符串)在我的coredata中。我想使用谓词来获取该字段是否包含数字,字符串包含' 0'。

我们不能使用' CONTAINS'因为' 0'也出现在
'。我需要使用NSPredicate来获取对象,以避免来自coredata的循环。

更新: 我只想测试是否0,1,2,3,4,5,6,7,8,9,10,11和#39;包含' 0'或不使用NSPredicate

解决

" MATCHES" NSPredicate的运算符可用于与正则表达式进行比较:

NSString *searchTerm = @"0";
NSString *regex = [NSString stringWithFormat:@"(.*,)?%@(,.*)?", searchTerm];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"strIndex MATCHES %@", regex];

这对我来说很好。谢谢@skagedal的建议。 我从Form NSPredicate from string that contains id's得到了这个答案。

3 个答案:

答案 0 :(得分:1)

@ bunty的回答是直接正确的,但有一个元回答。

您应该有一个Months实体,其中包含数据存储中一年中的12个月。然后,从包含该字符串的事物到Months实体具有一对多(有序或不依赖于需求)关系。

然后,您只需按照关系(即myThing.months)来获取实体所需的月份。

对于大型数据库,使用字符串匹配谓词的提取会非常慢,而且实际上有点反模式。

答案 1 :(得分:0)

您可以使用正则表达式检查以逗号分隔的数字,如下所示:

NSString *str = @"0,1,2,3,4,5,6,7,8,9,10,11";
NSString *regex = @"(\\d+)(,\\s*\\d+)*";
NSPredicate *myTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];

if ([myTest evaluateWithObject: str])
    NSLog(@"matched");
else
    NSLog(@"not matched");

因此,在使用字段名称从核心数据中获取数据时使用此谓词,如下所示:

NSError* error = nil;
NSString *regex = @"(\\d+)(,\\s*\\d+)*";
NSManagedObjectContext *context = [self managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"TableName" inManagedObjectContext:context];
[fetchRequest setEntity:entity];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"MonthFieldName MATCHES %@", regex];
[fetchRequest setPredicate:predicate];
NSArray* arrRecords = [context executeFetchRequest:fetchRequest error:&error];

答案 2 :(得分:0)

正如bunty写道,你可以使用正则表达式。如果我理解了这个问题,你需要一个谓词来查找特定的数字字符串 - 但前提是不要直接在其他数字之后或之后。这可以通过正则表达式中的 look-behind look-ahead断言来实现。更具体地说,否定后视/前瞻断言。

查看NSPredicate使用的syntax for regular expressions。要搜索号码val data = sc.textFile("...") data.map(_.split(' ').map(s => Array(s.toInt))) ,而不是查找111,请使用正则表达式:

10

因此,您可以使用以下内容构建Core Data谓词:

(?<!\d)1(?!\d)

这不是一个非常有效的搜索,但如果你的核心数据模型看起来像是什么,你不能轻易改变它,它可能正常工作。如果可以的话,我会考虑到bbum的建议并重新组织你的模型。