从iOS中的路径中删除点/双点
必须删除路径的所有单点组件 例如,“abi//bune”应该规范化为“abi/bune” 必须删除路径的所有双点组件及其父目录。例如,“abi/ba/./bune”应标准化为“abi/bune”从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
不使用正则表达式。你知道如何实现吗?这可以通过调用
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