正则表达式从Jdbc url中查找主机名

时间:2013-02-15 13:00:06

标签: java regex

我是regex的新手。我想使用正则表达式从postgreSQL jdbc URL检索主机名。 假设postgreSQL网址为jdbc:postgresql://production:5432/dbname。我需要检索“生产”,这是主机名。我想尝试使用正则表达式而不是Java分割功能。我试过

Pattern PortFinderPattern = Pattern.compile("[//](.*):*");
final Matcher match = PortFinderPattern.matcher(url);
if (match.find()) {
    System.out.println(match.group(1));
}

但它匹配从hostname到结尾的所有字符串。请帮帮我。

5 个答案:

答案 0 :(得分:1)

Pattern PortFinderPattern = Pattern.compile(".*:\/\/([^:]+).*");

答案 1 :(得分:1)

没有分组的正则表达式:

"(?<=//)[^:]*"

答案 2 :(得分:0)

[//]([\\w\\d\\-\\.]+)\:

应该足以可靠地找到它。虽然这可能是一个更好的正则表达式:

The Hostname Regex

答案 3 :(得分:0)

你的正则表达式中有一些错误:

[//] - 这只是一个字符,因为[]标记了一个字符类,因此它不会完全匹配//。要匹配它,您需要这样写:[/][/]\/\/

(.*) - 这会将所有字符与行尾匹配。如果你想要去某个角色,你需要更加具体。例如,您可以通过获取非冒号的所有字符来进入冒号,如下所示:([^:]*)

:* - 这使得冒号可选。我猜你忘了在冒号后加一个点(每个字符),如下所示::.*

所以这是你的正则表达式纠正:\/\/([^:]*):.*

希望这有帮助。

顺便说一句。如果生产后端口号是可选的(:5432),那么我建议使用以下正则表达式: \/\/([^/]*)(?::\d+)?\/

答案 4 :(得分:0)

要捕获Oracle和MySQL JDBC URL变体及其怪癖(例如Oracle允许使用@而不是//甚至@//),我使用此regexp获取主机名:[/@]+([^:/@]+)([:/]+|$)然后主机名在组1中。

代码,例如

String jdbcURL = "jdbc:oracle:thin:@//hostname:1521/service.domain.local";
Pattern hostFinderPattern = Pattern.compile("[/@]+([^:/@]+)([:/]+|$)");
final Matcher match = hostFinderPattern.matcher(jdbcURL);
if (match.find()) {
  System.out.println(match.group(1));
}

这适用于所有这些网址(和其他变体):

jdbc:oracle:thin:@//hostname:1521/service.domain.local
jdbc:oracle:thin:@hostname:1521/service.domain.local
jdbc:oracle:thin:@hostname/service.domain.local
jdbc:mysql://localhost:3306/sakila?profileSQL=true
jdbc:postgresql://production:5432/dbname
jdbc:postgresql://production/
jdbc:postgresql://production

这假定

  • 主机名在//@之后或其组合(单/也可以使用,但我认为JDBC不允许这样做。)

  • 主机名后跟:/或字符串末尾。

请注意+是贪婪的,这对中间人来说尤为重要。