问题描述
我想用正则表达式匹配一个insert的SQL语句,能够自动地将变量赋给对应的字段,比如SQL=“insert into table(item1,item2,item3) values(:item1,:item2,:item3)”map.put(item1,"111")map.put(item2,"222")map.put(item3,"333")我想用正则表达式自动的将SQL语句中的:item1,:item2,:item3替换成map中对应的“111”,"222","333"请问我该怎么写正则表达式的匹配语句和 对应的方法。
解决方案
搞错了。忘了加上非捕获组。刚才代码未验证。呵呵,偷懒了。String SQL="insert into table(item1,item2,item3) values(:item1,:item2,:item3)"; Map map = new HashMap();map.put("item1","111"); map.put("item2","222"); map.put("item3","333"); Pattern p=Pattern.compile("(?::)(\w+)(?:\b)"); Matcher m=p.matcher(SQL); StringBuffer result=new StringBuffer(); while (m.find()) { String key=m.group(1); m.appendReplacement(result,(String)map.get(key)); } m.appendTail(result); String resultSql=result.toString();System.out.println(resultSql);
解决方案二:
用PreparedStatement多好啊同样可以满足你的需求而且无需考虑单引号的转义,sql注入攻击这些问题
解决方案三:
引用不建议这么做,可能导致未验证BUG。至少 同上,这种做法无法防范SQL注入攻击
解决方案四:
Pattern p=Pattern.compile(":(\w+)\b");Match m=p.matcher(SQL);StringBuffer result=new StringBuffer();while (m.find()) { String key=m.group(1); m.appendReplacement(result,map.get(key));}m.appendTail(result);String resultSql=result.toString();不建议这么做,可能导致未验证BUG。至少对于这样的SQL是不适用的:SQL=“insert into table(item1,item2,item3) values('AAA:item1',:item2,:item3)”.会把字符串中的值替换掉。SQL还是用preparedStatement方式注入参数比较好。