Std 66 的“5.2.4. Remove Dot Segments”解释了如何将带.
和不带的路径转换..
为不带的路径。
IIUC,输入foo/../bar
处理如下。
- 在第 1 步中,(输入缓冲区,输出缓冲区)被初始化为 (
"foo/../bar"
,""
) - Step 2.E 用于得到 (
"/../bar"
,"foo"
) - 步骤 2.C 用于得到 (
"/bar"
,""
) - Step 2.E 用于得到 (
""
,"/bar"
) - 第 2 步循环退出
- 根据第 3 步,结果为
/bar
。
输入是相对路径,但输出是绝对路径,这对我来说似乎很奇怪。
在我看来,这可以通过在步骤 1中将 isAbsolute设置为 true 来解决,前提是输入缓冲区以 a 开头/
并将步骤 2.C 从
C. 如果输入缓冲区以前缀“/../”或“/..”开头,其中“..”是完整的路径段,则在输入缓冲区中将该前缀替换为“/”并删除来自输出缓冲区的最后一段及其前面的“/”(如果有);否则,
至
C. 如果输入缓冲区以前缀“/../”或“/..”开头,其中“..”是完整的路径段,则在输入缓冲区中将该前缀替换为“/”并删除输出缓冲区的最后一段及其前面的“/”(如果有),如果不是isAbsolute并且输出缓冲区为空,则从输入缓冲区的前面删除“/”;否则,
我误读了规范吗?由于某种原因我没有看到,这是理想的结果吗?
我将一个要点与我对规范的理解和我提出的“修复”的 Java 实现放在一起。