1

Javaを使用して単一の文字列から単一行のSQLコメントを削除するにはどうすればよいですか? 次のようなことを試しましたが、これは絶対確実ではないようです。select '--hi' from dual のように select ステートメントでリテラルとして表示される場合、'--' 文字を考慮する正規表現が必要です。

   protected String removeSingleLineComments(String sql)
{

  Pattern pattern = Pattern.compile("--[^\r\n]*");
  Matcher matcher = pattern.matcher(sql);


  while(matcher.find()) {


      if((matcher.start()==0) || (matcher.start()>0 && sql.charAt(matcher.start()-1) != '\''))
  {
      sql =sql.replace(sql.substring(matcher.start(), matcher.end()), "").trim();


  }
  }
  return sql;

} 
4

3 に答える 3

1

Regexp は次のようにする必要があります:--.*$移植可能な方法で行末に一致させるため。

于 2013-10-02T22:31:42.217 に答える
0

パターンは問題ないようです。マッチャーは次のように使用されます。

Pattern pattern = Pattern.compile("^(([^']+|'[^']*')*)--[^\r\n]*");
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
    matcher.appendReplacement(sb, "$1");
}
matcher.appendTail(sb);
return sb.toString();

パターンは次のことを行います。

^((
    [^']+
|
    '[^']*'
)*)
--[^\r\n]*

行頭、非アポストロフィ文字または文字列リテラルの繰り返し。余分な括弧は、$1 が残りの SQL を受け取るようにすることです。

于 2013-10-02T22:31:33.513 に答える
0

文字列をキャリッジ リターンで分割し、各行を「--」で分割します。

  private static String removeInLineSQLComments(String sql) {
      StringBuilder stringBuilder = new StringBuilder();
      for (String line : sql.split("\n")) {
          stringBuilder.append(line.split("--")[0]).append("\n");
      }
      return stringBuilder.toString();
  }
于 2020-10-14T04:34:45.120 に答える