如何用java替换JDBCURL中的模式?

如何用java替换JDBCURL中的模式?,java,Java,例如,像这样的jdbc url: jdbc:mysql://127.0.0.1:3306/XXXX?useUnicode=true&characterEncoding=utf-8 jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8 import java.net.MalformedURLException; import java.net.URL; public class Jdb

例如,像这样的jdbc url:

jdbc:mysql://127.0.0.1:3306/XXXX?useUnicode=true&characterEncoding=utf-8
jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8
import java.net.MalformedURLException;
import java.net.URL;

public class JdbcUrl {

    public static void main(String[] args) throws MalformedURLException {
        String jdbcUrl = "jdbc:mysql://127.0.0.1:3306/XXXX?useUnicode=true&characterEncoding=utf-8";
        String updatedUrl = jdbcUrl.replace(getDatabaseName(jdbcUrl), "YYYY");

        System.out.println(jdbcUrl);
        System.out.println(updatedUrl);
    }

    public static String getDatabaseName(String conStr) throws MalformedURLException {
        URL url = new URL("http" + conStr.substring(conStr.indexOf("://")));
        String dbName = url.getPath();

        while (dbName.startsWith("/")) {
            dbName = dbName.substring(1);
        }

        return dbName;
    }
}
如何将
XXXX
替换为
test

预期结果如下:

jdbc:mysql://127.0.0.1:3306/XXXX?useUnicode=true&characterEncoding=utf-8
jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8
import java.net.MalformedURLException;
import java.net.URL;

public class JdbcUrl {

    public static void main(String[] args) throws MalformedURLException {
        String jdbcUrl = "jdbc:mysql://127.0.0.1:3306/XXXX?useUnicode=true&characterEncoding=utf-8";
        String updatedUrl = jdbcUrl.replace(getDatabaseName(jdbcUrl), "YYYY");

        System.out.println(jdbcUrl);
        System.out.println(updatedUrl);
    }

    public static String getDatabaseName(String conStr) throws MalformedURLException {
        URL url = new URL("http" + conStr.substring(conStr.indexOf("://")));
        String dbName = url.getPath();

        while (dbName.startsWith("/")) {
            dbName = dbName.substring(1);
        }

        return dbName;
    }
}
注意:
XXXX
未知,主机ip:host
127.0.0.1:3306
也未知。换句话说,这两个字符串不是固定长度的

而且
?useUnicode=true&characterEncoding=utf-8
是可选的,这意味着url可能:

jdbc:mysql://127.0.0.1:3306/XXXX
那么结果应该是

jdbc:mysql://127.0.0.1:3306/test
感谢您的帮助,提前谢谢

编辑: 据我所知,正则表达式可以救我,但我想不出来

我所尝试的:

"jdbc:mysql://127.0.0.1:3306/xxxx?useUnicode=true&characterEncoding=utf-8"
.replaceAll("[^/]+\\?", "test?");
但当url为
jdbc:mysql://127.0.0.1:3306/xxxx

这应该可以做到:)

它只假设url包含“3306/”和“?useUnicode”:)

这应该可以做到:)


它只假设url包含“3306/”和“?useUnicode”:)

XXX是uri的路径。你可以这样替换它

String uriStr = "jdbc:mysql://127.0.0.1:3306/XXXX?useUnicode=true&characterEncoding=utf-8";
// this will result in mysql://127.0.0.1:3306/XXXX?useUnicode=true&characterEncoding=utf-8
String uriWithoutPrefixStr = uriStr.substring(5);
URI uri = URI.create(uriWithoutPrefixStr);
String newPath = "/test";
URI updatedUri = new URI(uri.getScheme(), uri.getUserInfo(), uri.getHost(), uri.getPort(), newPath, uri.getQuery(), uri.getFragment());
String backToJdbcFormat = "jdbc:" + updatedUri.toString();
System.out.println(backToJdbcFormat);

XXX是uri的路径。你可以这样替换它

String uriStr = "jdbc:mysql://127.0.0.1:3306/XXXX?useUnicode=true&characterEncoding=utf-8";
// this will result in mysql://127.0.0.1:3306/XXXX?useUnicode=true&characterEncoding=utf-8
String uriWithoutPrefixStr = uriStr.substring(5);
URI uri = URI.create(uriWithoutPrefixStr);
String newPath = "/test";
URI updatedUri = new URI(uri.getScheme(), uri.getUserInfo(), uri.getHost(), uri.getPort(), newPath, uri.getQuery(), uri.getFragment());
String backToJdbcFormat = "jdbc:" + updatedUri.toString();
System.out.println(backToJdbcFormat);

定义一个函数,如下所示:

public String getUrl(String ipAndPort, String dbName, String... optionals){

        if (ipAndPort == null || dbName == null)
            return null;
        if (ipAndPort.isEmpty() || dbName.isEmpty())
            return null;

        StringBuilder sb = new StringBuilder("jdbc:mysql://");
        sb
            .append(ipAndPort)
            .append("/")
            .append(dbName);

        if (optionals.length > 0)
            sb.append("?");

        for (int i=0;i<optionals.length;i=i+2){
            if (i>0)
                sb.append("&");
            sb
                .append(optionals[i])
                .append("=")
                .append(optionals[i+1]);
        }

        return sb.toString();
    }
publicstringgeturl(stringipandport、stringdbname、String…optionals){
if(ipAndPort==null | | dbName==null)
返回null;
if(ipAndPort.isEmpty()| | dbName.isEmpty())
返回null;
StringBuilder sb=新的StringBuilder(“jdbc:mysql://”);
某人
.append(ipAndPort)
.附加(“/”)
.append(dbName);
如果(可选长度>0)
某人加上(“?”);
对于(int i=0;i0)
某人附加(“&”);
某人
.附加(可选项[i])
.append(“=”)
.附加(可选[i+1]);
}
使某人返回字符串();
}

定义函数如下:

public String getUrl(String ipAndPort, String dbName, String... optionals){

        if (ipAndPort == null || dbName == null)
            return null;
        if (ipAndPort.isEmpty() || dbName.isEmpty())
            return null;

        StringBuilder sb = new StringBuilder("jdbc:mysql://");
        sb
            .append(ipAndPort)
            .append("/")
            .append(dbName);

        if (optionals.length > 0)
            sb.append("?");

        for (int i=0;i<optionals.length;i=i+2){
            if (i>0)
                sb.append("&");
            sb
                .append(optionals[i])
                .append("=")
                .append(optionals[i+1]);
        }

        return sb.toString();
    }
publicstringgeturl(stringipandport、stringdbname、String…optionals){
if(ipAndPort==null | | dbName==null)
返回null;
if(ipAndPort.isEmpty()| | dbName.isEmpty())
返回null;
StringBuilder sb=新的StringBuilder(“jdbc:mysql://”);
某人
.append(ipAndPort)
.附加(“/”)
.append(dbName);
如果(可选长度>0)
某人加上(“?”);
对于(int i=0;i0)
某人附加(“&”);
某人
.附加(可选项[i])
.append(“=”)
.附加(可选[i+1]);
}
使某人返回字符串();
}

作为正则表达式解决方案,您可以使用:

public class Requester {
  public static final String INPUT = 
      "jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8";
  public static final String REPLACEMENT = "replacement";

  public static final Pattern REGEX = 
      Pattern.compile("(?<before>jdbc:mysql:\\/\\/[^:\\/]+(?::[0-9]+)?\\/)[^?]+(?<after>\\?.*)?");

  public static void main(final String... args) {
    Matcher m = REGEX.matcher(INPUT);

    if (!m.matches()) {
      throw new AssertionError("Bad URL");
    }
    final String before = m.group("before");
    final String after = m.group("after");

    StringBuilder sb = new StringBuilder();
    sb.append(before);
    sb.append(REPLACEMENT);
    if (after != null) {
      sb.append(after);
    }

    System.out.println(sb);
  }
}
公共类请求程序{
公共静态最终字符串输入=
“jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8";
公共静态最终字符串替换=“替换”;
公共静态最终模式REGEX=
编译((?jdbc:mysql:\/\/[^:\/]+(?:[0-9]+)?\/)[^?]+(?\?*));
公共静态void main(最终字符串…参数){
匹配器m=正则表达式匹配器(输入);
如果(!m.matches()){
抛出新断言错误(“错误URL”);
}
最后一个字符串before=m.group(“before”);
最终字符串after=m.group(“after”);
StringBuilder sb=新的StringBuilder();
(在之前)附加某人;
某人追加(替换);
如果(在!=null之后){
(在之后)附加某人;
}
系统输出打印LN(sb);
}
}

作为正则表达式解决方案,您可以使用:

public class Requester {
  public static final String INPUT = 
      "jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8";
  public static final String REPLACEMENT = "replacement";

  public static final Pattern REGEX = 
      Pattern.compile("(?<before>jdbc:mysql:\\/\\/[^:\\/]+(?::[0-9]+)?\\/)[^?]+(?<after>\\?.*)?");

  public static void main(final String... args) {
    Matcher m = REGEX.matcher(INPUT);

    if (!m.matches()) {
      throw new AssertionError("Bad URL");
    }
    final String before = m.group("before");
    final String after = m.group("after");

    StringBuilder sb = new StringBuilder();
    sb.append(before);
    sb.append(REPLACEMENT);
    if (after != null) {
      sb.append(after);
    }

    System.out.println(sb);
  }
}
公共类请求程序{
公共静态最终字符串输入=
“jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8";
公共静态最终字符串替换=“替换”;
公共静态最终模式REGEX=
编译((?jdbc:mysql:\/\/[^:\/]+(?:[0-9]+)?\/)[^?]+(?\?*));
公共静态void main(最终字符串…参数){
匹配器m=正则表达式匹配器(输入);
如果(!m.matches()){
抛出新断言错误(“错误URL”);
}
最后一个字符串before=m.group(“before”);
最终字符串after=m.group(“after”);
StringBuilder sb=新的StringBuilder();
(在之前)附加某人;
某人追加(替换);
如果(在!=null之后){
(在之后)附加某人;
}
系统输出打印LN(sb);
}
}

您可以创建一个方法,提取数据库名称,然后替换它,如下所示:

jdbc:mysql://127.0.0.1:3306/XXXX?useUnicode=true&characterEncoding=utf-8
jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8
import java.net.MalformedURLException;
import java.net.URL;

public class JdbcUrl {

    public static void main(String[] args) throws MalformedURLException {
        String jdbcUrl = "jdbc:mysql://127.0.0.1:3306/XXXX?useUnicode=true&characterEncoding=utf-8";
        String updatedUrl = jdbcUrl.replace(getDatabaseName(jdbcUrl), "YYYY");

        System.out.println(jdbcUrl);
        System.out.println(updatedUrl);
    }

    public static String getDatabaseName(String conStr) throws MalformedURLException {
        URL url = new URL("http" + conStr.substring(conStr.indexOf("://")));
        String dbName = url.getPath();

        while (dbName.startsWith("/")) {
            dbName = dbName.substring(1);
        }

        return dbName;
    }
}
输出:

jdbc:mysql://127.0.0.1:3306/XXXX?useUnicode=true&characterEncoding=utf-8
jdbc:mysql://127.0.0.1:3306/YYYY?useUnicode=true&characterEncoding=utf-8

您可以创建一个提取db名称的方法,然后替换它,如下所示:

jdbc:mysql://127.0.0.1:3306/XXXX?useUnicode=true&characterEncoding=utf-8
jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8
import java.net.MalformedURLException;
import java.net.URL;

public class JdbcUrl {

    public static void main(String[] args) throws MalformedURLException {
        String jdbcUrl = "jdbc:mysql://127.0.0.1:3306/XXXX?useUnicode=true&characterEncoding=utf-8";
        String updatedUrl = jdbcUrl.replace(getDatabaseName(jdbcUrl), "YYYY");

        System.out.println(jdbcUrl);
        System.out.println(updatedUrl);
    }

    public static String getDatabaseName(String conStr) throws MalformedURLException {
        URL url = new URL("http" + conStr.substring(conStr.indexOf("://")));
        String dbName = url.getPath();

        while (dbName.startsWith("/")) {
            dbName = dbName.substring(1);
        }

        return dbName;
    }
}
输出:

jdbc:mysql://127.0.0.1:3306/XXXX?useUnicode=true&characterEncoding=utf-8
jdbc:mysql://127.0.0.1:3306/YYYY?useUnicode=true&characterEncoding=utf-8
还有一个正则表达式:

originalUrl.replaceAll("\\w+\\?", "test?");
请在另一个正则表达式中尝试:

originalUrl.replaceAll("\\w+\\?", "test?");

请在

尝试使用字符串替换将字符串解析为其组成部分,然后将其重新组合,替换正确的部分。请注意,JDBCURL是特定于驱动程序的,因此解决方案可能无法在所有驱动程序上运行。我投票的结果太笼统了,因为你没有表现出任何努力来解决这个问题。我想你的意思是你只想知道MySQL,因为JDBC是数据库访问的API,而不是特定于MySQL的。@Markrottveel好的,你说得对,很抱歉我的英语不好。
URL
旨在访问
MySQL
。您可以使用string replace将字符串解析为其组成部分,然后将其放回一起,替换正确的部分。请注意,JDBCURL是特定于驱动程序的,因此解决方案可能无法在所有驱动程序上运行。我投票的结果太笼统了,因为你没有表现出任何努力来解决这个问题。我想你的意思是你只想知道MySQL,因为JDBC是数据库访问的API,而不是特定于MySQL的。@Markrottveel好的,你说得对,很抱歉我的英语不好。
URL
旨在访问
MySQL
。感谢您的建议和支持,但端口号未知<代码>?useUnicode也是可选的。感谢您的建议和支持,但端口号未知<代码>?使用Unicode也是可选的。