使用模式匹配将所选文件从ios中的另一个NSArray复制到NSArray

时间:2012-12-19 09:04:26

标签: ios regex nsarray nsregularexpression

我有一个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开发的新手。

任何帮助都将深表感谢。

5 个答案:

答案 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类。链接:

http://developer.apple.com/library/ios/#documentation/Foundation/Reference/NSRegularExpression_Class/Reference/Reference.html

以下示例。

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开头)。路径将相对于您为枚举传递的目录。