2013-10-02 63 views
1

如何从单个字符串中使用Java删除单行SQL注释? 我尝试了类似于以下内容的内容,但这看起来似乎没有什么不妥。 需要一个正则表达式,当它们在选择语句中显示为文字时,将处理' - '字符,如从双重选择'--hi'。使用java删除单行SQL注释

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; 

} 
+0

什么是你的SQL示例的模式?它总是1行SQL?多行SQL,但你只想删除最后一行评论?你的代码如何失败? –

+0

呃,你确定你的行尾总是有两个字符吗?并非每个平台都使用相同的平台。如果'Pattern'的值是硬编码的,则可以将其设为常量实例。 'String'有一个'replaceAll()'方法,它将输入字符串(不需要'Pattern' /'Matcher'需要);你的'if'子句可以并且应该是正则表达式的一部分。 –

+0

我知道String.replaceAll()。不过,我需要处理' - '作为文本块的一部分出现,就像在 - 从双重选择'--hi'一样。用我的正则表达式,文本'--hi'也会被过滤掉。我需要一个新的模式来解释文本块 – user2589299

回答

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。

+0

在我的代码,我也需要进行检查,看是否“ - ”不是一个文本块中的一部分 - 选择双反“--hi”。在这种情况下,我的模式将不起作用。如何修改正则表达式来解释文本块? – user2589299

+0

好的考虑了字符串文字,不考虑反斜杠。 –

+0

我的字符串就像这样 - String a =“ - hi \ nselect'--hi'from dual \ n - morecomments \ n'。这个正则表达式仍然有效吗? – user2589299

0

正则表达式应为:--.*$,以便携式方式匹配行尾。