2012-04-19 19 views
3

誰かがこの1つを手伝ってくれることを願っています! 文字列からSQLコメントを削除するためのJava正規表現

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

(この機能が発見された:私はこの機能で、起動時にMySQLデータベースを初期化し、WebアプリケーションをBUITいる

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'); 
*/ 

私はこのようになりますSQLファイルを持っていますあなたの名前を引用していないことを私に許してください、私はそれを失った!!)

これは、SQLコメントブロックがない限り完全に動作します。

機能は基本的にはcopyToString()機能です。 文字列からブロックコメントを削除する正規表現を作成します。ファイル内にブロックのコメント/* */しかありません。--はありません。私がこれまで試してみました何

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

残念ながら、私は正規表現では非常に良好ではないよ...

私は「マッチした文字列は/* comment */ real statement /* another comment*/ようになり」のすべての問題を取得以下のように...

+0

正規表現に '?' lazy演算子 '?'が必要です – Gabber

答えて

7

はに気づく(

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

をお試しくださいは「lazy」を表す)。

EDIT:このアプローチを使用し、複数行のコメントをカバーするために:これはあなたのために働く

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

希望。

+0

これは、1行にあるブロックコメントでは動作しますが、複数行にあるブロックでは動作しません! '。*? 'もキャリッジリターンにマッチしますか? –

+0

まあ、 'Pattern.DOTALL'フラグを使って本格的な' Pattern'インスタンスを使う必要があります。私はすぐに答えを修正します。 –

+0

'Pattern'クラスのドキュメントを読んだあと、うまくいきます! –

2

あなたはこのような消極的修飾子を使用する必要がありますことを(使用Laziness Instead of Greedinessため.*?スタンド

select * from XYZ; 

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

出力:次の方法を試してみてください

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("/\\*.*?\\*/", "")); 
    } 
} 
2

を最大の文字列に一致する.*を意味しますデフォルトで可能です。すなわち、欲張り=>.*?式の?を使用して非貪欲に設定する必要があります)。

+0

怠惰と貪欲の説明に感謝します。私は少なくとも何かを学んだ。しかし、Alexander Pavlovのコメントをご覧ください。 –

0

それは...

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

を100%に動作しません私は研究しています溶液...これまでのところ、私が持っている

を複雑にしているように見える:

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

が、私はコメントだけを一致させる必要がありながら、それがすべて一致して...とばかり単一行コメントが先行したときに、それが失敗する可能性を発見... damn

+0

okだから、文字列のコメントはもう問題にはなりませんが、複数行のコメントの前の1行のコメントは...パーサは本当に簡単でしょう: '(?:[^ '] *? | '(?:[^'] | '')*? '(?!'))*?\ K \/\ *。*?\ * \/' – user2433984

関連する問題