1

我写了一个小的java工具,一开始我必须解析一个url。我想知道,您对我的解决方案有何看法以及是否有更好的方法?这里有些例子:

aaa://username:password@server:port/dir/

aaa://服务器:端口/目录/

aaa://服务器:端口

如果用户不小心,每一种字符串都是可能的。所以我的函数有可能得到这样的字符串

aaa://用户名:通过

也。但是字符串总是以 wwitch 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);
}

你怎么看?

4

3 回答 3

6

你看过URL 类吗?

有关示例,请参见此处。

于 2012-11-24T23:15:01.103 回答
0

就我个人而言,这看起来像是很多代码。我认为你可以更紧凑地使用regex,当你定义你的模式以及如何在一行中将它切割成不同的捕获组时,然后将你的组值读入 vars 并完成交易。我现在要运行,也许我以后可以想出代码,但只要看看下面java regex,Oracle 有一个相当不错的教程。

于 2012-11-24T23:16:10.770 回答
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];
}
于 2017-03-31T21:27:44.607 回答