首页 > 解决方案 > 解析 postgres URL

问题描述

我正在尝试解析 postgres db 凭据,格式如下:

postgres://usernname:password@hostaddress:port/databasename

我正在调用一种方法,该方法在一行中以字符串的形式返回这些凭据,并试图找出是否有一种简单的方法可以通过用户名、密码端口等而不是使用正则表达式来解析它们。

标签: javapostgresqlstring-parsing

解决方案


正如@OneCricketeer 在评论中所建议的那样——你可以使用 URI 解析器来做这种事情,在我看来这也是一个最好的解决方案。你可以这样实现它:

try {
    URI uri = new URI("postgres://username:password@host.com:123/databasename");
    String[] userAndPassword = uri.getUserInfo().split(":");
    String user = userAndPassword[0];
    String password = userAndPassword[1];
    String host = uri.getHost();
    int port = uri.getPort();
    String database = uri.getPath().substring(1);
} catch (URISyntaxException e) {
    e.printStackTrace(); // handle invalid JDBC URL syntax
}

还要考虑一下您的 JDBC URL - 也许您有可能将这些参数单独保存在某些配置中,并创建 JDBC URL 作为这些参数的连接?它会让事情变得更容易——这样你就不需要从 URL 中提取任何参数。


我在下面的旧答案(这比使用 URI 解析器更糟糕,但我留下它只是为了与上述解决方案进行比较):

我会使用正则表达式,在这种情况下不会那么难,然后很容易提取你需要的部分数据。

但是,您也可以使用splitString 的方法来获取您需要的部分字符串,例如:

String url = "postgres://username:password@hostaddress:port/databasename";
String[] urlSplitByColon = url.split(":");
String[] passwordAndHost = urlSplitByColon[2].split("@");
String[] portAndDatabaseName = urlSplitByColon[3].split("/");

String username = urlSplitByColon[1].substring(2); // substring to cut out double slash at the beginning of username
String password = passwordAndHost[0];
String host = passwordAndHost[1];
String port = portAndDatabaseName[0];
String databaseName = portAndDatabaseName[1];

但我真的建议使用正则表达式。


推荐阅读