使用java删除单行SQL注释
如何使用Java从单个字符串中删除单行SQL注释? 我尝试了以下方法,但这似乎不是万无一失的。 需要一个正则表达式,当“--”字符作为文本出现在select语句中时,该正则表达式将对其进行解释,就像从dual中选择“--hi”一样使用java删除单行SQL注释,java,sql,Java,Sql,如何使用Java从单个字符串中删除单行SQL注释? 我尝试了以下方法,但这似乎不是万无一失的。 需要一个正则表达式,当“--”字符作为文本出现在select语句中时,该正则表达式将对其进行解释,就像从dual中选择“--hi”一样 protected String removeSingleLineComments(String sql) { Pattern pattern = Pattern.compile("--[^\r\n]*"); Matcher matcher = pat
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;
}
图案看起来不错。匹配器用作:
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。模式看起来不错。匹配器用作:
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。Regexp应该是:
--.*$
,以便于携带的方式匹配行尾。Regexp应该是:--.*$
,以便于携带的方式匹配行尾。只需按回车符拆分字符串,然后按“-”拆分每行:
只需按回车分隔字符串,然后按“-”分隔每行:
您的SQL示例的模式是什么?它总是一行SQL吗?多行SQL,但您只想删除最后一行注释?你的代码怎么会失败?呃,你确定你的行尾总是两个字符吗?并非每个平台都使用相同的平台。如果
模式
的值是硬编码的,则可以将其设置为常量实例String
有一个replaceAll()
方法,该方法将接受输入字符串(不需要Pattern
/匹配器);您的if
子句可以而且应该是正则表达式的一部分。我知道String.replaceAll()。但是,我需要处理作为文本块的一部分出现的“--”,如从dual中选择“--hi”。在我的正则表达式中,文本“--hi”也会被过滤掉。我需要一个新的模式来解释文本块您的SQL示例的模式是什么?它总是一行SQL吗?多行SQL,但您只想删除最后一行注释?你的代码怎么会失败?呃,你确定你的行尾总是两个字符吗?并非每个平台都使用相同的平台。如果模式
的值是硬编码的,则可以将其设置为常量实例String
有一个replaceAll()
方法,该方法将接受输入字符串(不需要Pattern
/匹配器);您的if
子句可以而且应该是正则表达式的一部分。我知道String.replaceAll()。但是,我需要处理作为文本块的一部分出现的“--”,如从dual中选择“--hi”。在我的正则表达式中,文本“--hi”也会被过滤掉。我需要一个新模式来解释文本块在我的代码中,我还需要检查“---”是否不是文本块的一部分,因为从dual中选择“---hi”。在这种情况下,我的模式将不起作用。如何修改正则表达式来解释文本块?好的,考虑了的字符串文本,不考虑反斜杠。我的字符串类似于-字符串a=“--hi\n从dual\n--morecomments\n”中选择'--hi'。这个正则表达式还能用吗?是的。在我的代码中,我还需要检查“--”是否不是文本块的一部分,因为从dual中选择“--hi”。在这种情况下,我的模式将不起作用。如何修改正则表达式以解释文本块?好的,考虑了的字符串文本,而不考虑反斜杠。我的字符串类似于-string a=“--hi\n从dual\n--morecomments\n中选择“-hi”。此正则表达式仍然有效吗?是的。可以在小程序中尝试。