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

时间:2015-05-13 22:42:50

标签: ios objective-c path

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

例如," abi /./ bune"应该标准化为" abi / bune"。

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

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

2 个答案:

答案 0 :(得分:5)

这可以通过调用

来实现
NSString *standardizedPath = [path stringByStandardizingPath];

例如:

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

值得注意的是,这也删除了/private的所有初始组件,并尝试使用stringByExpandingTildeInPath扩展任何初始波形表达式。

答案 1 :(得分:1)

@ 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:@"/"];
}