2017-09-09 21 views
0

、このようなJDBC URL:testXXXXを交換する方法jdbc urlのスキーマをjavaに置き換えるにはどうすればよいですか?例えば

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 

注:XXXXが不明で、ホストIP:ホスト127.0.0.1:3306も不明です。言い換えれば、これら2つのストリングは固定長ではありません。

そして?useUnicode=true&characterEncoding=utf-8、それは多分、URLを意味し、オプションである:

jdbc:mysql://127.0.0.1:3306/XXXX 

、結果は

jdbc:mysql://127.0.0.1:3306/test 

する必要がありますすべてのヘルプは、事前に感謝を高く評価しています。

EDIT: 私の知る限りでは、正規表現は私を救うだろうが、私はそれを把握することはできません。

"jdbc:mysql://127.0.0.1:3306/xxxx?useUnicode=true&characterEncoding=utf-8" 
.replaceAll("[^/]+\\?", "test?"); 
をしかし、URLが jdbc:mysql://127.0.0.1:3306/xxxxあるとき、これは動作しません。私は試してみました何

+0

あなたは – Janar

+0

は、その構成部分に文字列を解析して、一緒に戻ってそれを入れて、右の部分(複数可)を置き換える置き換えた文字列を使用することができます。 JDBC URLはドライバ固有のものであるため、ソリューションはすべてのドライバで動作しない可能性があります。私はあなた自身でこれを解決する努力を示していないので、あまりにも広範囲に議論することに投票しました。 –

+0

私はあなたがMySQLを知りたいと思っていると思います。なぜなら、JDBCはデータベースアクセス用のAPIであり、MySQL固有のAPIではないからです。 –

答えて

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); 
    } 
} 
+0

これは素晴らしいです、ありがとうございます。 – Blank

0

これはトリックを行う必要があります:)

String original = "jdbc:mysql://127.0.0.1:3306/XXXX?useUnicode=true&characterEncoding=utf-8"; 
String xxxx = original.split("3306/")[1].split("\\?useUnicode")[0]; 
String updated = xxxx.replaceAll(xxxx,"test"); 

それが唯一のURLが含まれていることを前提とし、 "3306 /" と "?useUnicode" :)

+0

あなたの助言とupvoteに感謝しますが、ポート番号は不明です。 '?useUnicode'もオプションです。 – Blank

1

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); 
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(); 
    } 
0

あなたはデシベル名を抽出する方法を作成してから、ちょうど置き換えることができますそれは次のようなものです:

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 
関連する問題