【问题标题】:Regex to find hostname from Jdbc url正则表达式从 Jdbc url 中查找主机名
【发布时间】:2013-01-31 11:05:56
【问题描述】:

我是正则表达式的新手。我想使用正则表达式从 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));
}

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

【问题讨论】:

    标签: java regex


    【解决方案1】:
    Pattern PortFinderPattern = Pattern.compile(".*:\/\/([^:]+).*");
    

    【讨论】:

      【解决方案2】:

      没有分组的正则表达式:

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

      【讨论】:

        【解决方案3】:
        [//]([\\w\\d\\-\\.]+)\:
        

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

        The Hostname Regex

        【讨论】:

          【解决方案4】:

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

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

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

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

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

          希望这会有所帮助。

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

          【讨论】:

            【解决方案5】:

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

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

            注意+ 是贪心的,这对中间的尤其重要。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2010-10-01
              • 1970-01-01
              • 1970-01-01
              • 2012-07-18
              • 1970-01-01
              • 1970-01-01
              • 2019-09-23
              相关资源
              最近更新 更多