【问题标题】:Copying selected files to NSArray from another NSArray in ios using pattern matching使用模式匹配将所选文件从ios中的另一个NSArray复制到NSArray
【发布时间】:2012-12-06 14:12:40
【问题描述】:

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

任何帮助将不胜感激。

【问题讨论】:

    标签: ios regex nsarray nsregularexpression


    【解决方案1】:

    您可以使用方法- (NSArray *)filteredArrayUsingPredicate:(NSPredicate *)predicate 来过滤与您的模式匹配的对象。例如,类似以下的内容应该可以解决问题:

    NSPredicate *filter = [NSPredicate predicateWithFormat:@"SELF beginswith[cd] %@", predicateFilter];
    NSArray *filteredArray = [filePathsArray filteredArrayUsingPredicate:predicate];
    

    【讨论】:

      【解决方案2】:

      下面的代码应该是 hlp

      NSString *startPattern = @"snap";
      for (NSString *filePath in filePathsArray) {
          if (filePath.length < startPattern.length) {
              continue;
          }
          if ([[filePath substringToIndex:startPattern.length] isEqualToString:startPattern]) {
              // copy files
          }
      }
      

      【讨论】:

        【解决方案3】:

        这是一种方法:

        NSMutableArray *newArray = [NSMutableArray arrayWithCapacity: 5];
        for (NSString *string in filePathsArray)
            if ([string rangeOfString: @"snap"].location == 0)
                [newArray addObject: string];
        
        NSLog(@"%@", newArray);
        

        【讨论】:

          【解决方案4】:

          如果您更喜欢正则表达式,请使用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];
          
              }
          
          } ];
          

          【讨论】:

            【解决方案5】:

            请注意,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 开头的文件夹)。路径将相对于您为枚举传递的目录。

            【讨论】:

            • @user1814464 不客气。如果您正在寻找答案,请考虑将答案标记为正确。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-04-06
            • 1970-01-01
            • 1970-01-01
            • 2012-01-27
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多