我是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到结尾的所有字符串。请帮帮我。
答案 0 :(得分:1)
Pattern PortFinderPattern = Pattern.compile(".*:\/\/([^:]+).*");
答案 1 :(得分:1)
没有分组的正则表达式:
"(?<=//)[^:]*"
答案 2 :(得分:0)
答案 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不允许这样做。)
主机名后跟:
或/
或字符串末尾。
请注意+
是贪婪的,这对中间人来说尤为重要。