1

如何使用 Java 从单个字符串中删除单行 SQL 注释?我尝试了以下类似的方法,但这似乎不是万无一失的。需要一个正则表达式,当它们在 select 语句中显示为文字时,将解释 '--' 字符,如 select '--hi' from dual。

   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

正则表达式应该是: --.*$, 以可移植的方式匹配行尾。

于 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 回答