使用NSPredicate过滤文件路径

时间:2013-03-02 12:23:53

标签: ios regex filtering nspredicate

我正在尝试过滤格式为[number] _ [number] .png的文件路径数组 并且只获得以特定数字开头的那些,比如1。

这就是我的尝试:

NSPredicate *predicate = [NSPredicate predicateWithFormat:
                            @"self MATCHES '%@/1_[0-9]+.png'",
                            [[[NSBundle mainBundle] resourcePath]
                                stringByAppendingPathComponent:@"Images"]];

NSArray *files = [[[NSBundle mainBundle] pathsForResourcesOfType:@"png"
                                         inDirectory:@"Images"] 
                     filteredArrayUsingPredicate:predicate];

我得到一个空数组。 我尝试使用LIKE而不是MATCHES。我尝试使用[cd]标志尽管它无关紧要。我仍然总是得到一个空阵列。 这是正则表达式吗?


编辑:

似乎问题出在predicateWithFormat上。

我认为它会获得一个格式字符串,后跟要替换为格式字符串的参数。它不像那样工作。它忽略了参数,并且格式字符串中没有任何内容被替换。

所以解决方案如下:

NSPredicate *predicate = [NSPredicate predicateWithFormat:
                          [NSString stringWithFormat:
                           @"self MATCHES '%@/1_[0-9]+.png'",
                           [[[NSBundle mainBundle] resourcePath]
                              stringByAppendingPathComponent:@"Images"]]];

NSArray *files = [[[NSBundle mainBundle] pathsForResourcesOfType:@"png"
                                         inDirectory:@"Images"] 
                    filteredArrayUsingPredicate:predicate];

1 个答案:

答案 0 :(得分:0)

看起来问题是您的第一行代码和第二行代码之间存在冲突。第一行设置了NSPredicate,因此格式如下:

Images/1_#.png

在第二行中,告诉iOS在Images目录中查找谓词。通过这样做,您的最终谓词/路径如下所示:

Images/Images/1_#.png

删除将NSPredicate目录附加到谓词开头的Images/部分。

我上面描述的问题可能不是问题。代码的另一个可能问题是谓词的格式不正确。在原始代码中,您忘记在NSPredicate中+之后添加1(您是在[0-9]之后但不是1之后添加的。

您的代码应如下所示:

NSString *filter = @"1+_[0-9]+.png";
NSPredicate *predicate = [NSPredicate predicateWithFormat: @"self MATCHES %@", filter];
NSArray *files = [[[NSBundle mainBundle] pathsForResourcesOfType:@"png" inDirectory:@"Images"] filteredArrayUsingPredicate:predicate];

当我在我的应用程序中测试上面的代码时,NSPredicate成功过滤了NSString。

您可能还想查看此链接:http://useyourloaf.com/blog/2010/07/27/filtering-arrays-with-nspredicate.html