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-behindlook-ahead assertions 来实现。更具体地说,否定后视/前瞻断言。

看看 NSPredicate 使用的syntax for regular expressions。要搜索数字1,而不是同时找到1110,请使用正则表达式:

(?<!\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 检查以逗号分隔的一串数字是不是包含数字的主要内容,如果未能解决你的问题,请参考以下文章

c++读取以逗号为分隔符的一串数字

对 Pandas 列中的一串数字进行排序

把一串数字按照n用逗号分隔

NSPredicate 用数组搜索逗号分隔值

如何将由空格分隔的一串数字放入数组中? [复制]

检查逗号分隔列表是不是包含特定数字[重复]