编程题:解析URL
网址(web address)天天用,但它其实有个高大上的名字:**统一资源定位符(Uniform Resource Locator, URL)**,并且很有些门道:
URL的完整格式为:scheme ":" ["//" authority] path ["?" query] ["#" fragment]
其中authority又可分成[userinfo "@"] host [":" port],方括号的部分是可选的。
具体来说:
- 协议(scheme):必要。
- http https ftp ssh是常用的协议,它们的默认端口分别是:80 443 21 22。
- 其他协议的端口暂且用0代替。
- 授权(authority)可选
- 用户(userinfo):可选。
- 主机(host):必要。域名或IP。
- 端口(port):可选。协议通常有默认的端口。
- 路径(path):必要。包含起始的/。
- 查询(query):可选。?起始。
- 解析出变量和值。
- 片断(fragment):可选。不含起始的#。
那么本题的任务是:解析URL字符串的各组成部分,并按JSON格式输出。
目的:体验原始的字符串解析方法。掌握结构化数据的格式化输出方法。
提示:将解析和输出分开,使逻辑清晰。可尝试正则表达式的分割功能。
#### 输入规格
每行一个待解析的URL字符串,整行读入,处理到EOF为止。
#### 输出规格
对每个URL,以JSON格式输出解析结果:
json
{
"scheme": "",
"authority": {
"user": "",
"host": "",
"port": 0,
},
"path": "",
"query": {},
"fragment": ""
}
- 每级缩进为2个空格。
- 如某个成分不存在,对应的值输出null。如成分存在但为空,输出空串。
- 端口特殊处理:按整数输出,不加引号。如未指定则输出默认端口。
- authority为空时值设为null。
- query
- 如不存在输出null
- 如存在,根据&拆分成多个键值对,再根据=取出键和值。
- fragment
- 如不存在输出null
- 如存在值为#后的部分。
#### 样例输入
in
http://admin@127.0.0.1:9999/manual/search.php?target=print&limit=10#view=fit&row=5
https://gitee.com/codearhat/cpplab.git?#
ftp://guest@127.0.0.1:2121/pub/rfc3986.txt
#### 样例输出
out
{
"raw_url": "http://admin@127.0.0.1:9999/manual/search.php?target=print&limit=10#view=fit&row=5",
"scheme": "http",
"authority": {
"user": "admin",
"host": "127.0.0.1",
"port": 9999
},
"path": "/manual/search.php",
"query": {
"target": "print",
"limit": "10"
},
"fragment": "view=fit&row=5"
}
{
"raw_url": "https://gitee.com/codearhat/cpplab.git?#",
"scheme": "https",
"authority": {
"user": null,
"host": "gitee.com",
"port": 443
},
"path": "/codearhat/cpplab.git",
"query": {},
"fragment": ""
}
{
"raw_url": "ftp://guest@127.0.0.1:2121/pub/rfc3986.txt",
"scheme": "ftp",
"authority": {
"user": "guest",
"host": "127.0.0.1",
"port": 2121
},
"path": "/pub/rfc3986.txt",
"query": null,
"fragment": null
}
#### 样例解释
- 第1组:成分齐全。
- 第2组:有认证部分,但没用户名,补充默认端口。query和fragment部分存在,内容为空,输出空对象和空串。
- 第3组:没有query或fragment部分。
答案:若无答案欢迎评论
URL的完整格式为:scheme ":" ["//" authority] path ["?" query] ["#" fragment]
其中authority又可分成[userinfo "@"] host [":" port],方括号的部分是可选的。
具体来说:
- 协议(scheme):必要。
- http https ftp ssh是常用的协议,它们的默认端口分别是:80 443 21 22。
- 其他协议的端口暂且用0代替。
- 授权(authority)可选
- 用户(userinfo):可选。
- 主机(host):必要。域名或IP。
- 端口(port):可选。协议通常有默认的端口。
- 路径(path):必要。包含起始的/。
- 查询(query):可选。?起始。
- 解析出变量和值。
- 片断(fragment):可选。不含起始的#。
那么本题的任务是:解析URL字符串的各组成部分,并按JSON格式输出。
目的:体验原始的字符串解析方法。掌握结构化数据的格式化输出方法。
提示:将解析和输出分开,使逻辑清晰。可尝试正则表达式的分割功能。
#### 输入规格
每行一个待解析的URL字符串,整行读入,处理到EOF为止。
#### 输出规格
对每个URL,以JSON格式输出解析结果:
json
{
"scheme": "",
"authority": {
"user": "",
"host": "",
"port": 0,
},
"path": "",
"query": {},
"fragment": ""
}
- 每级缩进为2个空格。
- 如某个成分不存在,对应的值输出null。如成分存在但为空,输出空串。
- 端口特殊处理:按整数输出,不加引号。如未指定则输出默认端口。
- authority为空时值设为null。
- query
- 如不存在输出null
- 如存在,根据&拆分成多个键值对,再根据=取出键和值。
- fragment
- 如不存在输出null
- 如存在值为#后的部分。
#### 样例输入
in
http://admin@127.0.0.1:9999/manual/search.php?target=print&limit=10#view=fit&row=5
https://gitee.com/codearhat/cpplab.git?#
ftp://guest@127.0.0.1:2121/pub/rfc3986.txt
#### 样例输出
out
{
"raw_url": "http://admin@127.0.0.1:9999/manual/search.php?target=print&limit=10#view=fit&row=5",
"scheme": "http",
"authority": {
"user": "admin",
"host": "127.0.0.1",
"port": 9999
},
"path": "/manual/search.php",
"query": {
"target": "print",
"limit": "10"
},
"fragment": "view=fit&row=5"
}
{
"raw_url": "https://gitee.com/codearhat/cpplab.git?#",
"scheme": "https",
"authority": {
"user": null,
"host": "gitee.com",
"port": 443
},
"path": "/codearhat/cpplab.git",
"query": {},
"fragment": ""
}
{
"raw_url": "ftp://guest@127.0.0.1:2121/pub/rfc3986.txt",
"scheme": "ftp",
"authority": {
"user": "guest",
"host": "127.0.0.1",
"port": 2121
},
"path": "/pub/rfc3986.txt",
"query": null,
"fragment": null
}
#### 样例解释
- 第1组:成分齐全。
- 第2组:有认证部分,但没用户名,补充默认端口。query和fragment部分存在,内容为空,输出空对象和空串。
- 第3组:没有query或fragment部分。
答案:若无答案欢迎评论