2

我是正则表达式的新手。我想使用正则表达式从 postgreSQL jdbc URL 中检索主机名。

假设 postgreSQL url 将是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));
}

但它匹配从主机名到结尾的所有字符串。

4

5 回答 5

1

没有分组的正则表达式:

"(?<=//)[^:]*"
于 2013-02-15T13:07:06.367 回答
1
Pattern PortFinderPattern = Pattern.compile(".*:\/\/([^:]+).*");
于 2013-02-15T13:02:47.553 回答
0

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

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

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

:*- 这使得冒号是可选的。我猜你忘了在冒号后面加一个点(每个字符),像这样::.*

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

希望这可以帮助。

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

于 2013-02-15T13:16:31.710 回答
0
[//]([\\w\\d\\-\\.]+)\:

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

主机名正则表达式

于 2013-02-15T13:05:31.107 回答
0

为了还捕获 Oracle 和 MySQL JDBC URL 变体及其怪癖(例如 Oracle 允许使用@代替//或什至@//),我使用此正则表达式来获取主机名:[/@]+([^:/@]+)([:/]+|$)然后主机名在第 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));
}

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

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 不允许这样做)。

  • 在主机名之后:/字符串的结尾之后。

请注意,它们+是贪婪的,这对于中间的尤其重要。

于 2016-11-23T14:22:52.887 回答