NSPredicate 检查以逗号分隔的一串数字是不是包含数字
Posted
技术标签:
【中文标题】NSPredicate 检查以逗号分隔的一串数字是不是包含数字【英文标题】:NSPredicate to check whether a string of numbers separated by comma contains a numberNSPredicate 检查以逗号分隔的一串数字是否包含数字 【发布时间】:2016-01-04 07:02:31 【问题描述】:我的核心数据中有一个字符串"0,1,2,3,4,5,6,7,8,9,10,11"
(假定为月份索引字符串)。我想使用谓词来获取该字段是否包含数字,比如字符串是否包含“0”。
我们不能使用“CONTAINS”,因为“0”也出现在“10”中。我需要使用NSPredicate
获取对象以避免来自Core Data 的循环。
更新:
我只想使用NSPredicate
来测试'0,1,2,3,4,5,6,7,8,9,10,11' 是否包含'0'。
已解决
NSPredicate
的“MATCHES”运算符可用于与正则表达式进行比较:
NSString *searchTerm = @"0";
NSString *regex = [NSString stringWithFormat:@"(.*,)?%@(,.*)?", searchTerm];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"strIndex MATCHES %@", regex];
这对我来说很好。谢谢@skagedal 的建议。 我从Form NSPredicate from string that contains id's得到这个答案。
【问题讨论】:
看看这个http://***.com/questions/11597508/nspredicate-exact-match-with-string 让你的字符串为 00,01,02,03,04,05,06,07,08,09,10,11,12... 为什么你没有一个 Months 实体,然后从你的实体到 MOnths 有一对多关系? 【参考方案1】:@bunty 的回答直接正确,但是有一个元回答。
您可能应该在数据存储中拥有一个包含一年中 12 个月的 Months 实体。然后,从包含该字符串的事物到 Months 实体之间建立一对多(排序或不取决于需要)关系。
然后,您只需按照关系(即myThing.months
)来获取实体需要的月份。
对于大型数据库,使用字符串匹配谓词进行提取会很慢,而且确实有点反模式。
【讨论】:
@bbum :- 我们不能轻易更改 coredata 模型,因为这是一个小更新。所以我不得不与现有实体合作。 很公平。我去过那儿。经常。【参考方案2】:正如 bunty 所写,您可以使用正则表达式。如果我理解这个问题,您需要一个查找特定数字字符串的谓词——但前提是不直接在其他数字之前或之后。这可以通过在正则表达式中称为 look-behind 和 look-ahead assertions 来实现。更具体地说,否定后视/前瞻断言。
看看 NSPredicate 使用的syntax for regular expressions。要搜索数字1
,而不是同时找到11
和10
,请使用正则表达式:
(?<!\d)1(?!\d)
因此,您可以使用以下内容构建您的核心数据谓词:
NSString *month = @"11"; // the number you're looking for
NSString *regex = [NSString stringWithFormat:@"(?<!\d)%@(?!\d)", month];
NSPredicate *myTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
这不是一个非常有效的搜索,但如果这就是您的 Core Data 模型的样子并且您不能轻易更改它,它可能会正常工作。如果可以的话,我会接受 bbum 的建议并重新组织你的模型。
【讨论】:
正则表达式是一个不错的选择,我希望它是我情况的唯一解决方案。非常感谢你的建议。就我而言,您提供的表达式不起作用。但我从***.com/questions/14932595/… 得到了类似的问题。这对我来说效果很好。【参考方案3】:您可以使用以下正则表达式检查以逗号分隔的数字:
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];
【讨论】:
那么我们应该在哪里给出搜索词?以上是关于NSPredicate 检查以逗号分隔的一串数字是不是包含数字的主要内容,如果未能解决你的问题,请参考以下文章