Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/96.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从iOS中的路径中删除点/双点_Ios_Objective C_Path - Fatal编程技术网

从iOS中的路径中删除点/双点

从iOS中的路径中删除点/双点,ios,objective-c,path,Ios,Objective C,Path,必须删除路径的所有单点组件 例如,“abi//bune”应该规范化为“abi/bune” 必须删除路径的所有双点组件及其父目录。例如,“abi/ba/./bune”应标准化为“abi/bune” 不使用正则表达式。你知道如何实现吗?这可以通过调用 NSString *standardizedPath = [path stringByStandardizingPath]; 例如: "/usr/bin/./grep" -> "/usr/bin/grep" "/usr/i

必须删除路径的所有单点组件

例如,“abi//bune”应该规范化为“abi/bune”

必须删除路径的所有双点组件及其父目录。例如,“abi/ba/./bune”应标准化为“abi/bune”


不使用正则表达式。你知道如何实现吗?

这可以通过调用

NSString *standardizedPath = [path stringByStandardizingPath];
例如:

"/usr/bin/./grep"         ->    "/usr/bin/grep"
"/usr/include/objc/.."    ->    "/usr/include"

值得注意的是,这也会删除
/private
的任何初始组件,并尝试使用
stringByExpandingTildeInPath
来扩展任何初始tilde表达式。这可以通过调用

NSString *standardizedPath = [path stringByStandardizingPath];
例如:

"/usr/bin/./grep"         ->    "/usr/bin/grep"
"/usr/include/objc/.."    ->    "/usr/include"

值得注意的是,这还删除了
/private
的任何初始组件,并尝试使用
stringByExpandingTildeInPath

@来扩展任何初始平铺表达式。Daniel的答案是正确的。但是,由于在对这个问题的评论中有讨论,我决定提供一个代码示例来说明@Rey Gonzales对字符串进行标记并使用堆栈的想法

警告:此代码纯粹用于教育目的(因为有人在对问题的评论中要求此代码)。在现实生活中,坚持使用@Daniel的解决方案

代码可能如下所示:

-(NSString *)normalizePath:(NSString *)path {
    NSArray *pathComponents = [path componentsSeparatedByString:@"/"];

    NSMutableArray *stack = [[NSMutableArray alloc] initWithCapacity:pathComponents.count];

    for (NSString *pathComponent in pathComponents) {
        if ([pathComponent isEqualToString:@".."]) {
            [stack removeLastObject];
        }
        else {
            if (![pathComponent isEqualToString:@"."]) {
                [stack addObject:pathComponent];
            }
        }
    }

    return [stack componentsJoinedByString:@"/"];
}

@丹尼尔的答案是正确的。但是,由于在对这个问题的评论中有讨论,我决定提供一个代码示例来说明@Rey Gonzales对字符串进行标记并使用堆栈的想法

警告:此代码纯粹用于教育目的(因为有人在对问题的评论中要求此代码)。在现实生活中,坚持使用@Daniel的解决方案

代码可能如下所示:

-(NSString *)normalizePath:(NSString *)path {
    NSArray *pathComponents = [path componentsSeparatedByString:@"/"];

    NSMutableArray *stack = [[NSMutableArray alloc] initWithCapacity:pathComponents.count];

    for (NSString *pathComponent in pathComponents) {
        if ([pathComponent isEqualToString:@".."]) {
            [stack removeLastObject];
        }
        else {
            if (![pathComponent isEqualToString:@"."]) {
                [stack addObject:pathComponent];
            }
        }
    }

    return [stack componentsJoinedByString:@"/"];
}

使用堆栈。通过“/”标记字符串。将“.”视为一个pop命令,忽略“.”,然后将所有内容推送到另一个NSMutableArray。获取路径(NSString*)并将其拆分为由“/”字符分隔的组件。遍历所有组件。如果组件是“.”,则从可变数组中删除顶部对象。如果是“.”,则继续下一个组件。否则,将其添加到可变数组中。用“/”字符组合每个组件。如果你有abc/abi/ba/。/../bune,那应该是abc/bune吗?这需要一些代码高尔夫:一个objective-c解决方案,用尽可能多的代码规范化路径。谁会疯狂?使用堆栈。通过“/”标记字符串。将“.”视为一个pop命令,忽略“.”,然后将所有内容推送到另一个NSMutableArray。获取路径(NSString*)并将其拆分为由“/”字符分隔的组件。遍历所有组件。如果组件是“.”,则从可变数组中删除顶部对象。如果是“.”,则继续下一个组件。否则,将其添加到可变数组中。用“/”字符组合每个组件。如果你有abc/abi/ba/。/../bune,那应该是abc/bune吗?这需要一些代码高尔夫:一个objective-c解决方案,用尽可能多的代码规范化路径。谁在为NSScanner疯狂?好方法-发生了什么事?打字错误?@mc01否,
将进入一个目录。因此,
objc
好方法一起被删除了-
/objc/
发生了什么?打字错误?@mc01否,
将进入一个目录。因此,
objc