希望有人可以帮我解决这个问题!
我有一个如下所示的sql文件:
CREATE TABLE IF NOT EXISTS users(
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
firstname VARCHAR(30) NOT NULL,
lastname VARCHAR(30) NOT NULL,
PRIMARY KEY (id),
CONSTRAINT UNIQUE (firstname,lastname)
)
ENGINE=InnoDB
;
INSERT IGNORE INTO users (firstname,lastname) VALUES ('x','y');
/*
INSERT IGNORE INTO users (firstname,lastname) VALUES ('a','b');
*/
我已经创建了一个Web应用程序,它使用此函数在启动时初始化mysql数据库:
public static void initDatabase(ConnectionPool pool, File sqlFile){
Connection con = null;
Statement st = null;
String mySb=null;
try{
con = pool.getConnection();
mySb=IOUtils.copyToString(sqlFile);
// We use ";" as a delimiter for each request then we are sure to have well formed statements
String[] inst = mySb.split(";");
st = con.createStatement();
for(int i = 0; i<inst.length; i++){
// we ensure that there is no spaces before or after the request string
// in order not to execute empty statements
if(!inst[i].trim().isEmpty()){
st.executeUpdate(inst[i]);
}
}
st.close();
}catch(IOException e){
throw new RuntimeException(e);
}catch(SQLException e){
throw new RuntimeException(e);
}finally{
SQLUtils.safeClose(st);
pool.close(con);
}
}
(此功能在网上找到。作者,请原谅我没有引用你的名字,我输了!)
只要没有SQL注释块,它就能完美运行。
copyToString()
函数基本上完成了它所说的内容。
我现在想要的是构建一个将从字符串中删除块注释的正则表达式。我在文件中只有阻止评论/* */
,没有--
。
到目前为止我尝试过:
mySb = mySb.replaceAll("/\\*.*\\*/", "");
不幸的是,我不是很擅长正则表达式......
我遇到了“匹配的字符串看起来像/* comment */ real statement /* another comment*/
”等所有麻烦......等等...
答案 0 :(得分:8)
尝试
mySb = mySb.replaceAll("/\\*.*?\\*/", "");
(请注意代表“lazy”的?
。
编辑:要涵盖多行注释,请使用以下方法:
Pattern commentPattern = Pattern.compile("/\\*.*?\\*/", Pattern.DOTALL);
mySb = commentPattern.matcher(mySb).replaceAll("");
希望这适合你。
答案 1 :(得分:2)
你需要使用这样一个不情愿的限定符:
public class Main {
public static void main(String[] args) {
String s = "The matched string look something like /* comment */ real statement /* another comment*/";
System.err.println(s.replaceAll("/\\*.*?\\*/", ""));
}
}
答案 2 :(得分:2)
尝试以下方法:
String s = "/* comment */ select * from XYZ; /* comment */";
System.out.println(s.replaceAll("/\\*.*?\\*/", ""));
输出:
select * from XYZ;
.*?
代表使用Laziness Instead of Greediness(这意味着.*
默认匹配可能的最大字符串,即greedy =&gt;您必须将其配置为非贪婪使用?
表达式中的.*?
。
答案 3 :(得分:0)
它不会100%
工作注释可以是SQL中指定的有效字符串的一部分,在这种情况下,它们需要保留...
我正在研究解决方案......似乎很复杂
到目前为止,我有:\G(?:[^']*?|'(?:[^']|'')*?'(?!'))*?\/\*.*?\*\/
但它匹配所有我只需要匹配评论...并且发现它可能会在单行评论之前失败...该死的