あなたの知らない遠い世界。ここにもコンピュータがあり、ファイルシステムがあり、パスもある。
パスは「エントリ」と呼ばれる文字列のリストになっている。例えば、
foo/bar
というパスがある場合、
foo
と
bar
がエントリである。
しかし。
我々の世界と異なり、エントリ名にパス区切り文字と同じスラッシュ
/
が使える。
というわけで、パスを文字列として表現しようとするとエスケープする必要がある。
で。
エスケープ済みのパス文字列を与えるので、アンエスケープしてほしい。
生のエントリには、以下の文字が使える:
A
〜
Z
a
〜
z
0
〜
9
"
'
/
パスを文字列として表現する際には、区切り文字としてスラッシュ
/
を使う。
スラッシュはエントリ内にも登場するので、エントリ内のスラッシュは区切り文字でないことを明示する必要がある。
区切り文字でないことを示しつつスラッシュを表現する方法は、下記の3通りがある:
"
)
で囲む。
'
)
で囲む。
以下に例を挙げる:
パス文字列 | エントリのリスト |
---|---|
foo/bar/baz
|
foo
,
bar
,
baz
|
foo"/"bar/baz
|
foo/bar
,
baz
|
foo/'/bar/'/baz
|
foo
,
/bar/
,
baz
|
foo"/"bar/baz
|
foo/bar
,
baz
|
foo//bar/baz
|
foo/bar
,
baz
|
foo"//"bar/baz
|
foo//bar
,
baz
|
foo///bar
|
foo/
,
bar
|
foo/bar////baz
|
foo
,
bar//baz
|
区切り文字でない
/
を表現するのにクオート文字を使うので、クオート文字をエスケープする必要がある:
ダブルクオートで囲まれた範囲は、
パス文字列 | エントリのリスト |
---|---|
"foo'"/"bar'"/"baz'"
|
foo'
,
bar'
,
baz'
|
File/'I/O'
|
File
,
I/O
|
'foo//bar'//baz/qux
|
foo//bar/baz
,
qux
|
What/is/'"real"'
|
What
,
is
,
"real"
|
"foo'bar"/'hoge"fuga'
|
foo'bar
,
hoge"fuga
|
'"'a'"'/b
|
"a"
,
b
|
hoge"//"fuga//piyo
|
hoge//fuga/piyo
|
'foo"""bar'
|
foo"""bar
|
入力はこんな感じ:
foo/bar/baz
パス文字列がそのまま来る。
出力は、生のエントリのリストをコンマ区切りで。
こんな
foo,bar,baz
感じ。ただし、
/foo/bar/baz'/
のようなパス文字列として無効なもの(後述)に対しては、
-
を出力すること。
以下の場合は無効とする(とはいえ、前述の「生のエントリ」に含まれない文字が来た場合は不正な入力なので対処しなくてよい。下記のパターンに対処すれば良い。)
foo'bar
foo"'"bar
foo"bar
foo'"'bar
foo/''/bar
※ 真ん中のエントリが空文字列
foo/bar/
※ 末尾のエントリが空文字列
foo/bar/""
※ 末尾のエントリが空文字列
/foo/bar
※ 先頭のエントリが空文字列
''/foo/bar
※ 先頭のエントリが空文字列
\"
」と、エスケープされている。
# | 入力 | 期待 |
---|---|---|
0 |
foo/bar/baz
|
foo,bar,baz
|
1 |
/foo/bar/baz'/
|
-
|
2 |
"
|
-
|
3 |
'
|
-
|
4 |
/
|
-
|
5 |
""
|
-
|
6 |
''
|
-
|
7 |
//
|
/
|
8 |
"/'
|
-
|
9 |
'/"
|
-
|
10 |
Qux
|
Qux
|
11 |
Foo/Bar
|
Foo,Bar
|
12 |
foo"bar
|
-
|
13 |
foo'bar
|
-
|
14 |
/foo/bar
|
-
|
15 |
Foo//Bar
|
Foo/Bar
|
16 |
foo/bar/
|
-
|
17 |
'"'a'"'/b
|
"a",b
|
18 |
Foo"/"Bar
|
Foo/Bar
|
19 |
foo"'"bar
|
foo'bar
|
20 |
foo'"'bar
|
foo"bar
|
21 |
foo///bar
|
foo/,bar
|
22 |
"Z""tO"uFM
|
ZtOuFM
|
23 |
''/foo/bar
|
-
|
24 |
////'/"//'
|
///"//
|
25 |
File/'I/O'
|
File,I/O
|
26 |
Foo'//'Bar
|
Foo//Bar
|
27 |
foo/''/bar
|
-
|
28 |
foo/bar/""
|
-
|
29 |
'/////'////
|
///////
|
30 |
'foo"""bar'
|
foo"""bar
|
31 |
//'int'/V/c
|
/int,V,c
|
32 |
foo/bar/baz
|
foo,bar,baz
|
33 |
'H//Sg//zN'/
|
-
|
34 |
//'//"/'/'"'
|
///"/,"
|
35 |
foo//bar/baz
|
foo/bar,baz
|
36 |
"""///"/'/'//
|
///,//
|
37 |
58""N"//nIk'd
|
-
|
38 |
foo"/"bar/baz
|
foo/bar,baz
|
39 |
/////'"/'/'"/'
|
//,"/,"/
|
40 |
f"//J"/O9o"//'
|
-
|
41 |
foo"//"bar/baz
|
foo//bar,baz
|
42 |
foo/bar////baz
|
foo,bar//baz
|
43 |
"""'/'//'''/"//
|
'/'//'''//
|
44 |
8//'/k///"3da"'
|
8//k///"3da"
|
45 |
foo/'/bar/'/baz
|
foo,/bar/,baz
|
46 |
///''"//""///"""
|
/,/////
|
47 |
//wUJ8KNAk'n0//"
|
-
|
48 |
What/is/'"real"'
|
What,is,"real"
|
49 |
"//'/////"''/'//'
|
//'/////,//
|
50 |
"8hKE"3Fx/4//Hk/J
|
8hKE3Fx,4/Hk,J
|
51 |
'////''"'//'/"///'
|
////"//"///
|
52 |
Ro"/j''/2u/f/r/"3n
|
Ro/j''/2u/f/r/3n
|
53 |
hoge"//"fuga//piyo
|
hoge//fuga/piyo
|
54 |
'foo//bar'//baz/qux
|
foo//bar/baz,qux
|
55 |
//'//"'/"///'"/''//
|
///",///',/
|
56 |
2/L'3'A8p/7//wP49Jb
|
2,L3A8p,7/wP49Jb
|
57 |
"foo'"/"bar'"/"baz'"
|
foo',bar',baz'
|
58 |
'//'"//'///'///''"//
|
////'///'///''/
|
59 |
F6vX/q/Zu//5/'/H"/'w
|
F6vX,q,Zu/5,/H"/w
|
60 |
"foo'bar"/'hoge"fuga'
|
foo'bar,hoge"fuga
|
61 |
/"/'//'/"""''//'/"'''
|
-
|
62 |
0gK"koYUb""S/p''z/"Et
|
0gKkoYUbS/p''z/Et
|
63 |
Foo/Bar/"Hoge'/'Fuga"
|
Foo,Bar,Hoge'/'Fuga
|