我有一个字符串说,' 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得到了这个答案。
答案 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)))
,而不是查找1
和11
,请使用正则表达式:
10
因此,您可以使用以下内容构建Core Data谓词:
(?<!\d)1(?!\d)
这不是一个非常有效的搜索,但如果你的核心数据模型看起来像是什么,你不能轻易改变它,它可能正常工作。如果可以的话,我会考虑到bbum的建议并重新组织你的模型。