我有一个NSArray
,其中包含我应用的文档文件夹中的所有文件。
这是数组声明代码,
NSArray * filePathsArray ;
filePathsArray = [[NSFileManager defaultManager] subpathsOfDirectoryAtPath:documentsDirectory error:nil];
NSLog(@"Number of images in my app folder %d",[filePathsArray count]);
现在我要复制以名称“snap”(for ex: snap1 , snap2, snapRecent ...)
开头的文件
到另一个NSArray
。
如何使用模式匹配来做到这一点?我是iOS开发的新手。
任何帮助都将深表感谢。
答案 0 :(得分:0)
您可以使用方法- (NSArray *)filteredArrayUsingPredicate:(NSPredicate *)predicate
过滤与您的模式匹配的对象。例如,类似下面的内容应该成为诀窍:
NSPredicate *filter = [NSPredicate predicateWithFormat:@"SELF beginswith[cd] %@", predicateFilter];
NSArray *filteredArray = [filePathsArray filteredArrayUsingPredicate:predicate];
答案 1 :(得分:0)
以下代码应该是hlp
NSString *startPattern = @"snap";
for (NSString *filePath in filePathsArray) {
if (filePath.length < startPattern.length) {
continue;
}
if ([[filePath substringToIndex:startPattern.length] isEqualToString:startPattern]) {
// copy files
}
}
答案 2 :(得分:0)
这是一种方法:
NSMutableArray *newArray = [NSMutableArray arrayWithCapacity: 5];
for (NSString *string in filePathsArray)
if ([string rangeOfString: @"snap"].location == 0)
[newArray addObject: string];
NSLog(@"%@", newArray);
答案 3 :(得分:0)
如果您更喜欢正则表达式,请使用NSRegularExpression
类。链接:
以下示例。
NSError *error = nil;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"^snap" options:0 error:&error];
//check for error here
NSMutableArray *filteredArray = [NSMutableArray array];
[filePathsArray enumerateObjectsUsingBlock:^(id obj, NSUInteger index, BOOL *stop){
NSRange rangeOfFirstMatch = [regex rangeOfFirstMatchInString:obj options:0 range:NSMakeRange(0, [obj length])];
if (!NSEqualRanges(rangeOfFirstMatch, NSMakeRange(NSNotFound, 0))) {
[filteredArray addObject:obj];
}
} ];
答案 4 :(得分:0)
请注意,subpathsOfDirectoryAtPath
将对您的文件夹执行深度枚举(它也将搜索所有子文件夹)并返回相对于基本文件夹的路径。要查找以snap
开头的任何文件夹中的所有文件,您可以执行以下操作:
NSArray * filePathsArray = [[NSFileManager defaultManager] subpathsOfDirectoryAtPath: documentsDirectory error:nil];
NSIndexSet *indexes = [filePathsArray indexesOfObjectsPassingTest:^(id obj, NSUInteger idx, BOOL *stop){
return (BOOL)([[obj lastPathComponent] hasPrefix:@"snap"] && ![[[obj lastPathComponent] pathExtension] isEqualToString:@""]);
}];
NSArray *matches = [filePathsArray objectsAtIndexes:indexes];
现在matches
数组将包含以snap
开头的所有文件的路径(不包括文件夹,可能以snap
开头)。路径将相对于您为枚举传递的目录。