使用 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
在第二行中,您告诉 ios 在 Images
目录中查找您的谓词。通过这样做,您的最终谓词/路径如下所示:
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 过滤文件路径的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 NSPredicate 通过 CoreData 中的 NSSet 属性的元素过滤对象?
Hadoop MapReduce 文件路径过滤 GlobStatus 与 PathFilter
Hadoop MapReduce 文件路径过滤 GlobStatus 与 PathFilter