3

誰かがこれで私を助けてくれることを願っています!

私は次のようなSQLファイルを持っています:

CREATE TABLE IF NOT EXISTS users(
    id INT UNSIGNED NOT NULL AUTO_INCREMENT,
    firstname VARCHAR(30) NOT NULL,
    lastname VARCHAR(30) NOT NULL,

    PRIMARY KEY (id),
    CONSTRAINT UNIQUE (firstname,lastname)
)
ENGINE=InnoDB
;

INSERT IGNORE INTO users (firstname,lastname) VALUES ('x','y');
/*
INSERT IGNORE INTO users (firstname,lastname) VALUES ('a','b');
*/

この関数を使用して、起動時にmysqlデータベースを初期化するWebアプリケーションを作成しました。

public static void initDatabase(ConnectionPool pool, File sqlFile){
    Connection con = null;
    Statement st = null;
    String mySb=null;
    try{
        con = pool.getConnection();
        mySb=IOUtils.copyToString(sqlFile);

        // We use ";" as a delimiter for each request then we are sure to have well formed statements
        String[] inst = mySb.split(";");

        st = con.createStatement();

        for(int i = 0; i<inst.length; i++){
            // we ensure that there is no spaces before or after the request string
            // in order not to execute empty statements
            if(!inst[i].trim().isEmpty()){
                st.executeUpdate(inst[i]);
            }
        }
        st.close();
    }catch(IOException e){
        throw new RuntimeException(e);
    }catch(SQLException e){
        throw new RuntimeException(e);
    }finally{
        SQLUtils.safeClose(st);
        pool.close(con);
    }
}

(この関数はウェブ上で見つかりました。作者、あなたの名前を引用しないことを許してください、私はそれを失いました!!)

SQLコメントブロックがない限り、完全に機能します。

関数はcopyToString()基本的にそれが言うことをします。私が今欲しいのは、文字列からブロックコメントを削除する正規表現を作成することです。/* */ファイルにはブロックコメントしかありません--

私がこれまでに試したこと:

mySb = mySb.replaceAll("/\\*.*\\*/", "");

残念ながら、私は正規表現があまり得意ではありません...

「一致した文字列は次のようになります/* comment */ real statement /* another comment*/」などの問題が発生します。

4

4 に答える 4

10

試す

mySb = mySb.replaceAll("/\\*.*?\\*/", "");

(「怠惰?」の略であることに注意してください)。

編集:複数行のコメントをカバーするには、次のアプローチを使用します。

Pattern commentPattern = Pattern.compile("/\\*.*?\\*/", Pattern.DOTALL);
mySb = commentPattern.matcher(mySb).replaceAll("");

これがあなたのために働くことを願っています。

于 2012-04-19T10:19:49.110 に答える
2

次のような気が進まない修飾子を使用する必要があります。

public class Main {

    public static void main(String[] args) {
        String s = "The matched string look something like /* comment */ real statement /* another comment*/";
        System.err.println(s.replaceAll("/\\*.*?\\*/", ""));
    }
}
于 2012-04-19T10:19:49.350 に答える
2

次のアプローチを試してください。

String s = "/* comment */ select * from XYZ; /* comment */";
System.out.println(s.replaceAll("/\\*.*?\\*/", ""));

出力:

 select * from XYZ; 

は、貪欲の代わりに怠惰.*?を使用することを意味します(つまり、デフォルトで可能な最大の文字列に一致します。つまり、貪欲=>式でを使用して貪欲でないように構成する必要があります)。.*?.*?

于 2012-04-19T10:26:02.530 に答える
1

100%は機能しません

コメントは、SQLで指定された有効な文字列の一部にすることができ、その場合は保持する必要があります。

私はただ解決策を研究しています...複雑なようです

これまでのところ:

\G(?:[^']*?|'(?:[^']|'')*?'(?!'))*?\/\*.*?\*\/

しかし、コメントだけを一致させる必要がある間はすべて一致します...そして、1行のコメントが前に付いていると失敗する可能性があることがわかりました...くそー

于 2013-08-14T15:03:25.850 に答える