如何用java替换JDBCURL中的模式?
例如,像这样的jdbc url:如何用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: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:host127.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也是可选的。