0

私はたくさんのJAVAと.sqlファイルを持っている巨大なコードベースを持っています。これらすべてのファイルからすべてのSQLステートメントを抽出するつもりです。

これが私がこれを達成しようとしている方法です-

  1. 抽出する予定のselect、insert、delete、updateなどのパターンを含む正規表現ファイルを作成します。
  2. コードベースでファイルを1行ずつ解析し、正規表現と照合します。一致するものが見つかった場合は、コード行、ファイル名、パターンなどを登録します。

この問題は、SQLクエリが複数行に分割されている場合に発生します。

バッファリーダーを使用して行を読み取るときに、java.util.regex.Matcherメソッドとjava.util.regex.Patternメソッドを使用して正規表現パターンを構築/照合しています。

  pattern = Pattern.compile(regexString,Pattern.CASE_INSENSITIVE);
  .
  .
  matcher = pattern.matcher(lineBuffer.readline().trim());
  if( matcher.find()){
    //Do something
  }

複数行のステートメントの場合、行末記号「;」を探す必要があります。-見つからない場合は、次の行を読み取り、一致した文字列で出力を追加して、単一のクエリとして理解できるようにします。

 while(!lineString.endsWith(";")) {
   lineString = lineString + lineBfr.readLine().trim();
 }

Pattern.MULTILINEを使用するか、ファイル全体を単一のバッファーに読み込んでさらに処理するStreamBuffersを使用して、ここで要件の解決策を達成するためのより良い方法はありますか?

4

3 に答える 3

1

ファイルに一貫性のある予測可能な形式のSQLステートメントのみが含まれていない限り、正規表現を使用したSQLステートメントの解析は非常に複雑になると思います。

一見するとかなり単純に見えるかもしれませんが、処理する必要のある特殊なケースはたくさんあります。

  • コメントを適切に処理するのはどうですか?
  • SELECTという単語や文字列に含まれるセミコロンはどうですか?
  • 文字列のエスケープ文字はどうですか?

等々。これらすべてを処理しないと、すべてのステートメントを取得するほど単純なことを実行することさえできなくなります。

より良いアプローチは、既存のライブラリを使用してSQLを解析することです。この質問では、Javaにはいくつかの良いオプションがあるようです。Java用のSQLパーサーライブラリ

于 2012-10-24T13:22:31.970 に答える
1

Apache Commonsとその優れたメソッドFileUtils#readFileToString(File file)を利用できます。
これをあなたが言及したことと組み合わせるとPattern.MULTILINE、潜在的に非常に単純な解決策のように思われます。

于 2012-10-24T13:11:55.000 に答える
0

Javaファイル、より正確にはコンパイルされたJavaクラスの場合、私は同様のことを試みていますが、Javaデコンパイラーを使用して、SQLステートメントjavap -verboseで始まる文字列(タイプUtf8)selectまたはSQLステートメントのように見える文字列を検索しています。

これは進行中の作業であり、私は自分自身を混乱させているので、完全な解決策を投稿することはできませんが、これで十分に構築できるはずです。

于 2018-06-25T19:12:38.847 に答える