使用 NSPredicate 过滤文件路径

Posted

技术标签:

【中文标题】使用 NSPredicate 过滤文件路径【英文标题】:Filtering File Paths Using NSPredicate 【发布时间】:2013-03-02 12:23:52 【问题描述】:

我正在尝试过滤格式为 [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】:

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

Images/1_#.png

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

Images/Images/1_#.png

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

我上面描述的问题可能不是问题。代码的另一个可能问题是您的谓词格式不正确。在您的原始代码中,您忘记在 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

【讨论】:

@Ata01 是的,MATCHES 是您在这种情况下要查找的内容。我已经编辑了我的答案 - 请检查最后编辑的代码。我还添加了另一种可能的解释。 我已经尝试过在 '1' 之后带有加号的谓词并且没有它,它在这两种情况下都不起作用。我认为在我的情况下使用加号是不正确的,因为我只需要出现一个数字“1”,而不是一个或多个。我尝试使用您链接到的代码,它确实有效,但它只接受文件名并对它们进行过滤。所以我可以那样做。剥离路径,过滤文件名,然后添加完整路径,但如果可能的话,我想对完整路径进行过滤。

以上是关于使用 NSPredicate 过滤文件路径的主要内容,如果未能解决你的问题,请参考以下文章

Cocoa 中的自定义 NSPredicate

如何使用 NSPredicate 通过 CoreData 中的 NSSet 属性的元素过滤对象?

Hadoop MapReduce 文件路径过滤 GlobStatus 与 PathFilter

Hadoop MapReduce 文件路径过滤 GlobStatus 与 PathFilter

Django——模板路径 模板变量 常用过滤器 静态文件的使用

如何在不同的数据上使用 NSPredicate 和 NSPredicateEditor(多个谓词?)