1

我正在尝试过滤格式为 [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];
4

1 回答 1

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

于 2013-03-02T12:44:38.857 回答