我写了一个小的java工具,一开始我必须解析一个url。我想知道,你在考虑我的解决方案以及是否有更好的方法? 以下是一些例子:
AAA://用户名:密码@服务器:端口/目录/
AAA://服务器:端口/目录/
AAA://服务器:端口
如果用户不小心,每种字符串都是可能的。所以有可能,我的函数得到这样一个字符串
AAA://用户名:通
太。但字符串总是启动女巫aaa://。
这是我的代码:
url = url.replaceFirst(“aaa://”,“”);
String params[] = url.split("@");
if(params[0].compareTo("") != 0) {
String paramsfst[] = params[0].split(":");
if(params.length == 1) {
if(paramsfst.length >= 1) {
this.server = parsePort(paramsfst[0]);
if(paramsfst.length == 2) {
this.port = parsePort(paramsfst[1]);
}
}
} else {
String paramssec[] = params[1].split(":");
if(paramssec.length >= 1) {
this.server = parsePort(paramssec[0]);
if(paramssec.length == 2) {
this.port = parsePort(paramssec[1]);
}
}
if(paramsfst.length == 2) {
this.username = paramsfst[0];
this.password = paramsfst[1];
}
}
if(url.contains("/")) {
this.path = url.substring(url.indexOf("/"), url.length() -1);
}
private String parsePort(String port) {
int i = port.indexOf("/");
if(i == -1) {
return port;
}
return port.substring(0, i);
}
您怎么看?
答案 0 :(得分:5)
你看过URL class吗?
请参阅此处for an example。
答案 1 :(得分:0)
就个人而言,这看起来像我的口味很多代码。我认为你可以使用regex
更紧凑地指出它,当你定义你的模式以及如何在一行中的不同捕获组中砍掉它时,然后将你的组值读入vars并完成交易。我现在必须运行,也许我可以稍后提出代码,但只需查看java regex
,Oracle有一个相当不错的教程。
答案 2 :(得分:0)
我认为您正在寻找java.net.URI:
final String destination = "ftp://anonymous@localhost:21/inbox?password=secret"
final URI uri = new URI(destination);
String host = uri.getHost(); //localhost
final int port = uri.getPort(); //21
final String directoryPath = uri.getPath(); //inbox
String username = uri.getUserInfo(); //anonymous
//The password can exist as a query parameter or as part of the user info
final List<NameValuePair> queryParams = URLEncodedUtils.parse(uri, "UTF-8");
final Map<String, String> paramsMap = new HashMap();
queryParams.forEach((param) -> { paramsMap.put(param.getName(), param.getValue()); });
String password = null;
if (paramsMap.containsKey("password"))
{
password = paramsMap.get("password"); //secret
}
else if ((username != null) && username.contains(":"))
{
password = username.split(":")[1];
username = username.split(":")[0];
}