必须删除路径的所有单点组件。
例如," abi /./ bune"应该标准化为" abi / bune"。
必须删除路径的所有双点组件及其父目录。例如," abi / ba /../ bune"应该标准化为" abi / bune"。
不使用正则表达式。知道如何实现吗?
答案 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:@"/"];
}