package com.test; import java.util.regex.Matcher; import java.util.regex.Pattern; public class TestReg { public static void main(String[] args) { String sql = "select * from student where sno in ('101','102','103') or sname in ('bb','aa','cc') or grade in (80,100,90,70)"; System.out.println("beforeSql="+sql); System.out.println("afterSql="+convert(sql)); } /** * 该方法是用来替换 in语句的 * @param sql * @return */ private static String convert(String sql) { Pattern pattern = Pattern.compile("in",Pattern.CASE_INSENSITIVE); Matcher match = pattern.matcher(sql); while(match.find()) { String afterInSql = sql.substring(sql.indexOf("in")); //得到in后面的所有语句 String beforeInSql = sql.substring(0,sql.indexOf("in")).trim();//得到in前面的语句 String inSql = afterInSql.substring(0,afterInSql.indexOf(")")+1); //将类似于 in (101,102,104,103)这样的语句截取出来 String fieldSql = beforeInSql.substring(beforeInSql.lastIndexOf(" ")+1); //得到in前面的字段 eg :sno in (101,102)中的"sno" StringBuffer conditionInSql = new StringBuffer(fieldSql).append(" ").append(inSql); //将字段和in组装起来:eg: sno in (101,102,103) String valueString = inSql.substring(inSql.indexOf("(")+1, inSql.lastIndexOf(")")); StringBuffer result = new StringBuffer("(");//将in条件改了的最终结果:将其改成 sno=101 or sno = 102 or sno = 103 or sno = 104 String[] valueArray = valueString.split(","); for(String value : valueArray) { result.append(fieldSql).append("=").append(value).append(" or "); } result.delete(result.lastIndexOf(" or"), result.length()).append(")"); //结果:(sno=101 or sno=102 or sno=103) String conditionResultSql = conditionInSql.toString().replaceAll("//(", "(").replaceAll("//)", ")");; Pattern pt = Pattern.compile(conditionResultSql,Pattern.CASE_INSENSITIVE); Matcher m = pt.matcher(sql); sql = m.replaceAll(result.toString()); } return sql; } }