`
53873039oycg
  • 浏览: 824089 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

[简单]替换字符串中的参数

    博客分类:
  • java
 
阅读更多

         这段代码估计用不到了,写的很简单,用了最直观的思路替换参数

        

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class 替换字符串参数_S4_Test {
	public static void main(String[] args) throws Exception {
		 String str="select rownum, bb.* from (select :a, :b + 4, 4 + :c, 5 + :b, to_char(:c, 'yyy-mm-dd'), to_date(:v, 'yyyy-mm-dd') from a where a.order_id = :b and b in (:b) and c in (:b, :l) and d in (:l, 0) and e in (0, :l) and extract(month from b.done_date) = to_date(:b, 'yyyy-mm-dd') and b.prod_spec_id = :MODEL_ID and extract(month from b.done_date) = extract(month from to_date(:b, ' yyyy - mm ')) and to_date(b, 'yyyy-mm-dd') = extract(month from :done_date) and a.order_type = 80 and extract(month from b.done_date) = to_date(:b, 'yyyy-mm-dd') and extract(month from b.done_date) = extract(month from to_date(:b, 'yyyy-mm')) and to_date(b, 'yyyy-mm-dd') = extract(month from :done_date) and extract(month from b.done_date) = extract(month from to_date(:b, ' yyyy - mm ')) union select extract(month from to_date(:b, ' yyyy - mm ')), to_char(:v, 'yyy-m-dd'), to_char(to_date(:b, 'yyy-mm-dd'), 'yyyy-mm-dd') from b group by a having extract(month from b.done_date) = :b and b = :b union all select extract(month from to_date(:b, ' yyyy - mm ')), to_char(:v, 'yyy-m-dd'), to_char(to_date(:b, 'yyy-mm-dd'), 'yyyy-mm-dd') from b group by a having(extract(month from b.done_date) = :b and b = :b) and b = :k) bb group by aa, bb desc having(aa = :k and bb > :b + 5) ";
		 str = addSqlBlank(str);
		 List<String> sqlList = splitSqlByUnion(str);
		 str=replaceSqlNullValue(sqlList);
		 System.out.println("替换结果为="+str);
	}
	
	public static String replaceSqlNullValue(List<String> sqlList)throws Exception {
		if(sqlList==null||sqlList.size()==0){
			return "";
		}
		StringBuffer sb2=new StringBuffer();
		for (String sql : sqlList) {
			// 取真实的from 是否带where 是否带having
			int existsIndex = sql.lastIndexOf(" exists(");
			int havingIndex = sql.indexOf(" having");
			int fromIndex = sql.lastIndexOf(" from ");
			int whereIndex = sql.indexOf(" where ");
			int extractIndex = sql.lastIndexOf(" extract(");
			String selectSqlStr = null;
			if (havingIndex != -1 && fromIndex > havingIndex) {
				fromIndex = sql.substring(0, havingIndex).lastIndexOf(" from ");
			}
			if (whereIndex != -1 && extractIndex != -1) {
				fromIndex = sql.substring(0, whereIndex).lastIndexOf(" from ");
			}
			if (whereIndex != -1 && fromIndex > existsIndex) {
				while (existsIndex != -1 && fromIndex > existsIndex) {
					String tmpStr = sql.substring(0, existsIndex);
					fromIndex = tmpStr.lastIndexOf(" from ");
					existsIndex = tmpStr.lastIndexOf(" exists(");
				}
			}
			selectSqlStr = sql.substring(0, fromIndex + 6);
			sql = sql.substring(fromIndex + 6);
			sb2.append(replaceNullValueAfterSelect(selectSqlStr));
			sb2.append(removeAllErrorConnect(replaceValueAfterFrom(sql)));
		}
		return sb2.toString();
	}
	
	public static String replaceNullValueAfterSelect(String sql) {
		if (sql.indexOf(":") == -1) {
			return sql;
		}
		int position = sql.indexOf(":");
		StringBuffer before = new StringBuffer();
		StringBuffer after = new StringBuffer();
		int beforeBracket = 0;// 匹配括号数量
		boolean isConnect = false;
		char bracketBeforeChar = '\0', bracketAfterChar = '\0';
		//直接拿到字符串
		while (position != -1) {
			// 向←直到空格或者开始
			for (int i = position - 1; i >= 0; i--) {
				if (sql.charAt(i) == '(') {
					beforeBracket++;
				} else if (sql.charAt(i) == ')') {
					beforeBracket--;
				}
				if (sql.charAt(i) == ',' || sql.charAt(i) == ' ') {
					break;
				} else if (sql.charAt(i) == '+' || sql.charAt(i) == '-') {
					isConnect = true;
					before.append(sql.charAt(i));
					bracketBeforeChar = sql.charAt(i);
					break;
				} else {
					before.append(sql.charAt(i));
				}
			}
			// 向→直到空格或者最后
			for (int i = position; i < sql.length(); i++) {
				if (beforeBracket != 0) {
					if (sql.charAt(i) == '(') {
						beforeBracket++;
					} else if (sql.charAt(i) == ')') {
						beforeBracket--;
					}
					after.append(sql.charAt(i));
					continue;
				}
				if (sql.charAt(i) == '+' || sql.charAt(i) == '-') {
					bracketAfterChar = sql.charAt(i);
					after.append(sql.charAt(i));
					isConnect = true;
					break;
				}
				if (sql.charAt(i) != ' ' && sql.charAt(i) != ',') {
					after.append(sql.charAt(i));
				} else {
					break;
				}
			}
			after.insert(0, before.reverse());
			if (isConnect) {
				sql = sql.replace(
						after.toString(),
						String.valueOf(
								bracketBeforeChar + "'0'" + bracketAfterChar)
								.replace('\0', ' '));
			} else {
				sql = sql.replace(after.toString(), "' '");
			}
			position = sql.indexOf(":");
			before.setLength(0);
			after.setLength(0);
			beforeBracket = 0;
			isConnect = false;
			bracketAfterChar = '\0';
			bracketBeforeChar = '\0';
		}
		after = null;
		before = null;
		sql = sql.replaceAll("(extract\\s*\\()([^)]*'\\s+')(\\s*\\))", "' '");;
		return new String(sql);
	}
	
	public static String replaceValueAfterFrom(String sql) throws Exception {
		if (sql.indexOf(":") == -1) {
			return sql;
		}
		StringBuffer result = new StringBuffer();
		//含连接符
		String[] tmpStrArr = splitByStrNormal(sql, "(?<=\\s+)(and|or)(?=\\s+|\\s*\\()");
		for (String subStr : tmpStrArr) {
			if (subStr.indexOf(":") == -1) {
				if (subStr.replaceAll("(?<=\\s+|^)(and|or)(?=\\s+|\\)|$)", "").trim().length() == 0) {
					result.append(' ');
				} else {
					result.append(subStr);
				}
			} else if (subStr.indexOf(" in ") != -1) {
				result.append(replaceNullParaWithIn(subStr));
			} else {
				result.append(replaceParaNormalWithBlank(subStr));
			}
		}
		return result.toString();
	}
	
	public static String replaceParaNormalWithBlank(String sql) throws Exception {
		int position = sql.indexOf(":");
		if (position == -1) {
			return sql;
		}
		// 忽略extract
		if (sql.indexOf("extract") != -1) {
			return removeExtract(sql);
		}
		if (sql.indexOf("to_date") == -1 && sql.indexOf("to_char") == -1) {
			if (sql.indexOf("+") != -1 || sql.indexOf("-") != -1) {
				return replaceParaWithConnect(sql);
			}
		}
		StringBuffer before = new StringBuffer();
		StringBuffer after = new StringBuffer();
		int leftBracket =0, rightBracket =0;
		// 括号匹配
		int beforeBracket = 0;// 匹配括号数量
		int leftIndex=0,rightIndex=sql.length();
		while (position != -1) {
			 leftBracket =Math.abs(sql.substring(0, position).replaceAll("\\(", "").length()-sql.substring(0, position).replaceAll("\\)", "").length());
			 rightBracket =Math.abs(sql.substring(position).replaceAll("\\(", "").length()-sql.substring(position).replaceAll("\\)", "").length());
			 if(leftBracket>rightBracket){
				for (int i = 0; i < position; i++) {
					if (sql.charAt(i) == '(') {
						beforeBracket++;
					} else if (sql.charAt(i) == ')') {
						beforeBracket--;
					}
					if(beforeBracket==leftBracket-rightBracket){
						leftIndex=i+1;
						break;
					}
				}
			 }else if(leftBracket<rightBracket){
				 for(int i=sql.length()-1;i>position;i--){
					if (sql.charAt(i) == '(') {
						beforeBracket--;
					} else if (sql.charAt(i) == ')') {
						beforeBracket++;
					}
					if(beforeBracket==rightBracket-leftBracket){
						rightIndex=i;
						break;
					}
				 }
			 }
			// 向←直到空格或者开始
			for (int i = position - 1; i >=leftIndex; i--) {
				if (sql.charAt(i) != ' ') {
					if (sql.charAt(i) == '(') {
						beforeBracket++;
					} else if (sql.charAt(i) == ')') {
						beforeBracket--;
					}
					before.append(sql.charAt(i));
				} else {
					break;
				}
			}
			// 向→直到空格或者最后
			for (int i = position; i <rightIndex; i++) {
				if (beforeBracket != 0) {
					if (sql.charAt(i) == '(') {
						beforeBracket++;
					} else if (sql.charAt(i) == ')') {
						beforeBracket--;
					}
					after.append(sql.charAt(i));
					continue;
				}
				if (sql.charAt(i) != ' ' && sql.charAt(i) != ')') {
					after.append(sql.charAt(i));
				} else {
					break;
				}
			}
			after.insert(0, before.reverse());
			sql = sql.replace(after.toString(), "");
			position = sql.indexOf(":");
			before.setLength(0);
			after.setLength(0);
			beforeBracket = 0;
			leftIndex=0;
			rightIndex=sql.length();
		}
		before.setLength(0);
		after.setLength(0);
		after = null;
		before = null;
		if(sql.indexOf("(")==-1&&sql.indexOf(")")==-1){
			return sql.replaceAll("(?<=\\s+|^)(and|or)(?=\\s+|\\)|$)", "");
		}
		return sql;
	}
	
	public static String removeExtract(String sql) throws Exception {
		int beforeBracket=0;
		int position=sql.indexOf(":");
		String subStr=sql.substring(0,position);
		int whereIndex=subStr.lastIndexOf(" where "); 
		int havingIndex=subStr.lastIndexOf(" having "); 
		int havingIndex2=subStr.lastIndexOf(" having( "); 
		StringBuffer result=new StringBuffer();
		//删除extract
		if(whereIndex!=-1){
			result.append(sql.substring(0, whereIndex+" where ".length()));
			sql=sql.substring(whereIndex+" where ".length());
		}else if(havingIndex!=-1){
			result.append(sql.substring(0, havingIndex+" having ".length()));
			sql=sql.substring(havingIndex+" having ".length());
		}else if(havingIndex2!=-1){
			result.append(sql.substring(0, havingIndex2+" having(".length()));
			sql=sql.substring(havingIndex2+" having(".length());
		}
		boolean paramFlag=false,bracketEnd=false;
		for(int i=Math.max(0,havingIndex2),len=sql.length();i<len;i++){
			if(sql.charAt(i)=='('){
				beforeBracket++;
				bracketEnd=true;
				continue;
			}else if(sql.charAt(i)==')'){
				beforeBracket--;
				continue;
			}
			if(sql.charAt(i)==':'){
				paramFlag=true;
			}
			if(bracketEnd&&paramFlag&&beforeBracket==0){
				if(sql.charAt(i)==' '||sql.charAt(i)==')'){
					result.append(sql.substring(i));
					break;
				}
			}
		}
		return replaceNullParaWithIn(result.toString());
	}
	
	// 含<>的连接符的变量替换为0
	public static String replaceParaWithConnect(String sql) {
		int position = sql.indexOf(":");
		StringBuffer before = new StringBuffer();
		StringBuffer after = new StringBuffer();
		while (position != -1) {
			if (sql.substring(0, position).indexOf(">") == -1
					&&sql.substring(0, position).indexOf("<") == -1
					&&sql.substring(0, position).indexOf("!=") == -1) {
				// 向←直到连接符
				for (int i = position - 1; i >= 0; i--) {
					if (sql.charAt(i) != '(') {
						before.append(sql.charAt(i));
					} else {
						break;
					}
				}
				// 向→直到连接符或者最后
				for (int i = position; i < sql.length(); i++) {
					if (sql.charAt(i) == ' ' || sql.charAt(i) == ')') {
						break;
					} else {
						after.append(sql.charAt(i));
					}
				}
				after.insert(0, before.reverse());
				sql = sql.replace(after.toString(), "");
			} else {
				// 向←直到连接符
				for (int i = position - 1; i >= 0; i--) {
					if (sql.charAt(i) != '=' && sql.charAt(i) != '<'
							&& sql.charAt(i) != '>' && sql.charAt(i) != '+'
							&& sql.charAt(i) != '-') {
						before.append(sql.charAt(i));
					} else {
						break;
					}
				}
				// 向→直到连接符或者最后
				for (int i = position; i < sql.length(); i++) {
					if (sql.charAt(i) == '+' || sql.charAt(i) == '-'
							|| sql.charAt(i) == ')') {
						break;
					} else {
						after.append(sql.charAt(i));
					}
				}
				after.insert(0, before.reverse());
				sql = sql.replace(after.toString(), "'0'");
			}
			position = sql.indexOf(":");
			before.setLength(0);
			after.setLength(0);
		}
		before.setLength(0);
		after.setLength(0);
		after = null;
		before = null;
		sql=sql.replaceAll("(\\(\\s*)(and|or)(\\s+)", "( ");
		sql=sql.replaceAll("(\\s*)(and|or)(\\s*\\(\\s*\\))", " ");
		return new String(sql);
	}

	// 替换in括号内的参数
	public static String replaceNullParaWithIn(String sql) throws Exception {
		int position = sql.indexOf(":");
		if (position == -1 || sql.indexOf("in") == -1) {
			return removeInErrorSem(sql);
		}
		StringBuffer before = new StringBuffer();
		StringBuffer after = new StringBuffer();
		while (position != -1) {
			// 向←直到空格或者开始
			for (int i = position - 1; i >= 0; i--) {
				if (sql.charAt(i) != ' ' && sql.charAt(i) != ',') {
					before.append(sql.charAt(i));
				} else {
					break;
				}
			}
			// 向→直到空格或者最后
			for (int i = position; i < sql.length(); i++) {
				if (sql.charAt(i) != ' ' && sql.charAt(i) != ','
						&& sql.charAt(i) != ')') {
					after.append(sql.charAt(i));
				} else {
					break;
				}
			}
			after.insert(0, before.reverse());
			sql = sql.replace(after.toString(), "");
			position = sql.indexOf(":");
			before.setLength(0);
			after.setLength(0);
		}
		before.setLength(0);
		after.setLength(0);
		after = null;
		before = null;
		sql = removeInErrorSem(sql);
		sql = sql.replaceAll(",\\s*\\)", ")");
		sql = sql.replaceAll("in\\s*\\(\\s*\\)", "in()");
		sql = removeInBlankBracket(sql);
		return new String(sql);
	}

	// 清除in括号内多余的逗号
	public static String removeInErrorSem(String str) throws Exception {
		int position = str.indexOf(" in");
		if (position == -1) {
			return str;
		}
		StringBuffer sb = new StringBuffer();
		boolean isStart = false;
		int endIndex = str.length();
		while (position != -1) {
			sb.append(str.substring(0, position + 3));
			for (int i = position + 3; i < str.length(); i++) {
				if (str.charAt(i) == '(') {
					sb.append(str.charAt(i));
					continue;
				}
				if (str.charAt(i) == ')') {
					sb.append(str.charAt(i));
					endIndex = i;
					break;
				}
				if (str.charAt(i) != ',') {
					sb.append(str.charAt(i));
					if (str.charAt(i) != ' ') {
						isStart = true;
					}
				} else if (isStart && str.charAt(i) == ',') {
					sb.append(str.charAt(i));
					isStart = false;
				}
			}
			str = str.substring(endIndex + 1);
			endIndex = str.length();
			position = str.indexOf(" in");
		}
		if (str != null) {
			sb.append(str);
		}
		str = sb.toString();
		sb.setLength(0);
		sb = null;
		return new String(str);
	}

	// 清除in空括号
	public static String removeInBlankBracket(String sql) {
		if (sql.indexOf("in()") == -1) {
			return sql;
		}
		int position = sql.indexOf("in()");
		StringBuffer sb = new StringBuffer();
		int startIndex = 0;
		boolean isParam = false, isChange = false;
		;
		while (position != -1) {
			for (int i = position - 1; i >= 0; i--) {
				if (!isParam) {
					if (sql.charAt(i) != ' ') {
						isParam = true;
						continue;
					}
				}
				if (isParam) {
					if (sql.charAt(i) == '(') {
						isParam = false;
						startIndex = i + 1;
						isChange = true;
						break;
					} else if (i >= 2 && sql.charAt(i) == 'd'
							&& sql.charAt(i - 1) == 'n'
							&& sql.charAt(i - 2) == 'a') {
						isParam = false;
						isChange = true;
						startIndex = i - 2;
						break;
					} else if (i >= 1 && sql.charAt(i) == 'r'
							&& sql.charAt(i - 1) == 'o') {
						isParam = false;
						isChange = true;
						startIndex = i - 1;
						break;
					}
				}
			}
			if (isChange) {
				sb.append(sql.substring(0, startIndex));
			} else {
				sb.append(sql.substring(0, position + 4));
			}
			startIndex = 0;
			isParam = false;
			isChange = false;
			sql = sql.substring(position + 4);
			position = sql.indexOf("in()");
		}
		if (sql != null) {
			sb.append(sql);
		}
		sql = sb.toString();
		sb.setLength(0);
		sb = null;
		sql = sql.replaceAll("(\\(\\s*)(and|or)(\\s+)", "( ");
		sql = sql.replaceAll("(\\s*|^)(and|or)(\\s*\\(\\s*\\))", " ");
		return new String(sql);
	}

	public static String removeAllErrorConnect(String sql) throws Exception {
		sql = replaceSqlWithRegex(sql,"(\\(\\s*)(and|or)(\\s*\\)?)", new int[]{1,3});
		sql = replaceSqlWithRegex(sql,"(\\s+)(and|or)(\\s*\\))", new int[]{1,3});
		sql = replaceSqlWithRegex(sql,"(\\s+and|or)(\\(\\s*,?\\s*\\))(\\s*,?$?)", new int[]{3});// 清空空括号
		sql = replaceSqlWithRegex(sql, "(\\s*)(\\(\\s*,?\\s*\\))(\\s*,?$?)", new int[]{3});// 清空空括号
		sql = replaceSqlWithRegex(sql, "(where\\s+)(and|or|in)(\\s+|$)", new int[]{1});
		sql = replaceSqlWithRegex(sql,"(\\s+)(where|having|order\\s+by|group\\s+by)(\\s*$|\\s*\\)|\\s+union)",new int[]{3});
		sql = replaceSqlWithRegex(sql, "where\\s+(group|order|$)", new int[]{1});
		sql = replaceSqlWithRegex(sql, "having\\s+(order|$)", new int[]{1});
		sql = replaceSqlWithRegex(sql, "group\\s+by\\s+(order|$)", new int[]{1});
		sql = sql.replaceAll("\\s{2,}", " ");// 删除多余空格
		return new String(sql);
	}
	
	// sql添加空格
	public static String addSqlBlank(String sql) throws Exception {
		sql = replaceSqlWithRegex(sql, "(\\s+)(=|<|>|!|-|\\+|\\*|/|\\()(\\s+)",new int[]{2});// 去除运算符附近空格
		sql = replaceSqlWithRegex(sql, "(\\s+)(=|<|>|!|-|\\+|\\*|/)(\\s*)", new int[]{2});// 去除运算符附近空格
		sql = replaceSqlWithRegex(sql, "(\\s*)(=|<|>|!|-|\\+|\\*|/)(\\s+)", new int[]{2});// 去除运算符附近空格
		sql = replaceSqlWithRegex(sql, "(where\\s+)(,|and|or|in)(\\s+|$)", new int[]{1});// 清空where后面直接带连接符
		sql = cleanSqlComment(sql);
		sql = lowerCaseOracleKeyWord(sql);
		
		sql = sql.replaceAll("\\s*:\\s*", ":");// 去除:附近空格
		sql = sql.replaceAll("\\*from", "* from ");// from前面添加空格
		sql = sql.replaceAll("select", "select ");// from前面添加空格
		sql = sql.replaceAll("\\)", " )");// )前面添加空格
		sql = sql.replaceAll("(?<!and|or)\\s*\\(\\s*", "(");// 去除(附近空格
		sql = sql.replaceAll("\\s+in\\s*\\(", " in ( ");// in(添加空格
		sql = sql.replaceAll("\\s+having\\s*\\(", " having( ");// having(添加空格

		sql = sql.replaceAll(",", " , ");// ,后面添加空格
		// 删除不匹配的注释
		sql = sql.replace("/*", " ");
		sql = sql.replace("*/", " ");
		return new String(sql);
	}
		
	public static String replaceSqlWithRegex(String sql, String regex,
			int[] indexs) throws Exception {
		Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
		Matcher m = p.matcher(sql);
		Arrays.sort(indexs);
		// 添加循环匹配失败检测
		int isFail = 0;
		while (true) {
			while (m.find()) {
				isFail++;
				if (isFail > Byte.MAX_VALUE) {
					throw new Exception("检测到匹配次数过多,请优化匹配表达式");
				}
				String tmp = new String();
				for (int i = 0; i < indexs.length; i++) {
					tmp += m.group(indexs[i]);
				}
				sql = sql.replace(m.group(), tmp);
			}
			m = p.matcher(sql);
			if (!m.find()) {
				break;
			}
			m.reset();
		}
		return new String(sql);
	}

	// 数据库关键字小写
	public static String lowerCaseOracleKeyWord(String sql) throws Exception {
		String regexStr = "(?<=\\s+|\\(|\\)|^)(select|as|from|where|and|or|in|exists|extract|to_date|to_char|not|trunc|group|by|having|order)(?=\\s+|\\(|\\)|$)";
		sql = replaceStrByAppend(regexStr, sql, true);
		return sql;
	}

	// 大小写字符串
	public static String replaceStrByAppend(String regEx, String sql,
			boolean isLower) {
		Pattern pattern = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE);
		Matcher matcher = pattern.matcher(sql);
		StringBuffer sb = new StringBuffer();
		int lastEnd = 0;// 上一次匹配结束位置
		while (matcher.find()) {
			sb.append(sql.substring(lastEnd, matcher.start()));
			if (isLower) {
				sb.append(sql.substring(matcher.start(), matcher.end())
						.toLowerCase());
			} else {
				sb.append(sql.substring(matcher.start(), matcher.end()));
			}
			lastEnd = matcher.end();
		}
		if (lastEnd < sql.length()) {
			sb.append(sql.substring(lastEnd));
		}
		return sb.toString();
	}

	public static List<String> splitSqlByUnion(String sql){
		List<String> resultList=new ArrayList<String>();
		if(sql.indexOf(" union ")==-1){
			resultList.add(sql);
		}else{
			int position=sql.indexOf(" union ");
			while(position!=-1){
				String tmpStr=sql.substring(0,sql.indexOf(" union ")+7);
				resultList.add(tmpStr);
				sql=sql.substring(sql.indexOf(" union ")+7);
				position=sql.indexOf(" union ");
			}
			if(sql!=null){
				resultList.add(sql);
			}
		}
		return resultList;
	}
	
	// 字符串分割保留分隔符
	public static String[] splitByStrNormal(String str, String split) {
		Pattern p = Pattern.compile(split);
		Matcher m = p.matcher(str);
		String[] words = p.split(str);
		String[] strResult = new String[words.length];
		strResult[0] = words[0];
		if (words.length > 0) {
			int count = 1;
			while (count < words.length) {
				if (m.find()) {
					strResult[count] = new String(m.group() + words[count]);
				}
				count++;
			}
		}
		return strResult;
	}

	// 清除sql内的注释
	public static String cleanSqlComment(String sql) {
		if (sql.indexOf("/*") == -1) {
			return sql;
		}
		StringBuilder sb = new StringBuilder((int) (sql.length() * 1.5));
		int cursor = 0, start = -1, end = -1;
		for (; (start = sql.indexOf("/*", cursor)) != -1
				&& (end = sql.indexOf("*/", start)) != -1;) {
			sb.append(' ').append(sql.substring(cursor, start));
			cursor = end + 2;
		}
		sb.append(sql.substring(cursor, sql.length()));
		return sb.toString();
	}

	// 初步检查sql是否正确 规则1)select前面有其他字符,2)sql括号数量不匹配 3)sql中注释不匹配
	public static String checkSql(String sql) {
		StringBuffer errorInfo = new StringBuffer();
		sql = sql.trim().toLowerCase();
		if (!sql.startsWith("select")) {
			errorInfo.append(" select开始前有其他字符");
		}
		int leftBracket = sql.length() - sql.replaceAll("\\(", "").length(), rightBracket = sql
				.length() - sql.replaceAll("\\)", "").length();
		if (leftBracket != rightBracket) {
			errorInfo.append(" 括号不匹配");
		}
		sql = cleanSqlComment(sql);
		if (sql.indexOf("/*") != -1 || sql.indexOf("*/") != -1) {
			errorInfo.append(" sql中存在多余的注释");
		}
		return errorInfo.toString();
	}

	public static StringBuffer map2StringBuffer(Map<String, String> map) {
		StringBuffer result = new StringBuffer();
		for (Entry<String, String> entry : map.entrySet()) {
			result.append(entry.getKey()).append("=").append(entry.getValue())
					.append(",");
		}
		if (result.length() > 0) {
			result.deleteCharAt(result.length() - 1);
		}
		return result;
	}

}

    替换前:

   

select rownum, bb.*
  from (select :a,
               :b + 4,
               4 + :c,
               5 + :b,
               to_char(:c, 'yyy-mm-dd'),
               to_date(:v, 'yyyy-mm-dd')
          from a
         where a.order_id = :b
           and b in (:b)
           and c in (:b, :l)
           and d in (:l, 0)
           and e in (0, :l)
           and extract(month from b.done_date) = to_date(:b, 'yyyy-mm-dd')
           and b.prod_spec_id = :MODEL_ID
           and extract(month from b.done_date) =
               extract(month from to_date(:b, ' yyyy - mm '))
           and to_date(b, 'yyyy-mm-dd') = extract(month from :done_date)
           and a.order_type = 80
           and extract(month from b.done_date) = to_date(:b, 'yyyy-mm-dd')
           and extract(month from b.done_date) =
               extract(month from to_date(:b, 'yyyy-mm'))
           and to_date(b, 'yyyy-mm-dd') = extract(month from :done_date)
           and extract(month from b.done_date) =
               extract(month from to_date(:b, ' yyyy - mm '))
        union
        select extract(month from to_date(:b, ' yyyy - mm ')),
               to_char(:v, 'yyy-m-dd'),
               to_char(to_date(:b, 'yyy-mm-dd'), 'yyyy-mm-dd')
          from b
         group by a
        having extract(month
          from b.done_date) = :b and b = :b
        union all
        select extract(month from to_date(:b, ' yyyy - mm ')),
               to_char(:v, 'yyy-m-dd'),
               to_char(to_date(:b, 'yyy-mm-dd'), 'yyyy-mm-dd')
          from b
         group by a
        having(extract(month
          from b.done_date) = :b and b = :b) and b = :k) bb
 group by aa, bb desc
having(aa = :k and bb > :b + 5)

   替换后:

  

替换结果为=select  rownum ,  bb.* from(select ' ' ,  '0'+4 ,  4+'0'  ,  5+'0'  ,  ' ' ,  ' ' from a where d in ( 0 ) and e in ( 0 ) and a.order_type=80 union select  ' ' ,  ' ' ,  ' ' from b group by a union all select  ' ' ,  ' ' ,  ' ' from b group by a ) bb group by aa , bb desc having( bb>'0'+5 ) 

  

select rownum, bb.*
  from (select ' ', '0' + 4, 4 + '0', 5 + '0', ' ', ' '
          from a
         where d in (0)
           and e in (0)
           and a.order_type = 80
        union
        select ' ', ' ', ' '
          from b
         group by a
        union all
        select ' ', ' ', ' ' from b group by a) bb
 group by aa, bb desc
having(bb > '0' + 5)

    全文完

 

 

 

2
2
分享到:
评论

相关推荐

    命令行下替换字符串的简单工具

    命令行下替换字符串,用于英文替换,中文替换会出错

    字符串的replace方法应用浅析

    接下来的参数是与模式中的子表达式匹配的字符串,可以有 0 个或多个这样的参数。接下来的参数是一个整数,声明了匹配在 stringObject 中出现的位置。最后一个参数是 stringObject 本身。对于replacement是函数的情况...

    curly-bracket-parser:简单的解析器替换模板字符串和文件中的变量

    大括号解析器 Javascript库提供了一个简单的解析器,可以轻松替换URL,文本甚至文件(仅节点)之类的字符串中的大括号{{like_this}} 。 可用于节点js和浏览器! 对内置过滤器和自定义过滤器的附加支持使它们更强大。...

    substitute-string-action:Y使用YAML轻松替换或替换GitHub Actions中的字符串

    替代字符串作用GitHub动作,可使用YAML轻松替换或替换文本或文件中的字符串!用法最简单的用法可以配置如下: jobs : build : runs-on : ubuntu-latest steps : - uses : bluwy/substitute-string-action@v1 id : ...

    VBA常用技巧

    技巧6替换单元格内字符串24 技巧7复制单元格区域25 技巧8仅复制数值到另一区域28 8-1使用选择性粘贴28 8-2直接赋值的方法29 技巧9单元格自动进入编辑状态30 技巧10禁用单元格拖放功能30 技巧11单元格格式操作31 11-1...

    Javascript中字符串replace方法的第二个参数探究

    第二个参数一般我们放入的是字符串,用来替换掉正则匹配到的文本。 其实replace远比上面说的要强大的多,它的内部已经封装的很完善了,远不是我们想象的那么简单,下面我们就来详细聊聊replace的第二个参数。 实例...

    peachfuzz:受简单胡子启发的字符串替换微型库

    桃花 简单的 Mustache 启发了字符串替换。应用程序接口 peachfuzz ( template : string , context : Object , transform : Function ) : string用法 var peachfuzz = require ( 'peachfuzz' ) ;peachfuzz ( 'Hello {...

    qsfuzz:qsfuzz(查询字符串模糊)允许您构建自己的规则来模糊查询字符串并轻松识别漏洞

    qsfuzz qsfuzz(查询字符串模糊)是允许您在YAML中编写简单规则的工具,这些规则定义了要注入的值,以及如果注入成功将产生的预期结果。传递带有查询字符串的URL列表,然后qsfuzz将用您的注入替换查询字符串值,以...

    js中字符串编码函数escape()、encodeURI()、encodeURIComponent()区别详解

    JavaScript中有三个可以对字符串编码的函数,分别是: escape,encodeURI,encodeURIComponent,相应3个解码函数: unescape,decodeURI,decodeURIComponent 。 下面简单介绍一下它们的区别 1 escape()函数 定义和...

    驼峰转下划线、下划线转驼峰的java工具类

    camelToUnderscore方法接收一个驼峰命名的字符串作为参数,并返回相应下划线命名的字符串。 underscoreToCamel方法则是接收一个下划线命名的字符串,将其转换为驼峰命名形式的字符串。 String result = ...

    VBScript 语言参考中文手册CHM

    InStrRev 函数 返回一个字符串在另一个字符串中出现的位置,是从字符串的末尾算起。 Int 函数 返回数的整数部分。 整数除法运算符(\) 两数相除,返回的商取其整数部分。 Is 运算符 比较两个对象引用变量。 ...

    CMD命令行高级教程

    1、字符串替换 2、字符串截取 第六章 if 命令讲解 第一种用法:IF [NOT] ERRORLEVEL number command 第二种用法:IF [NOT] string1==string2 command 第三种用法:IF [NOT] EXIST filename command 第四种用法:IF ...

    VBSCRIPT中文手册

    InStrRev 函数 返回一个字符串在另一个字符串中出现的位置,是从字符串的末尾算起。 Int 函数 返回数的整数部分。 整数除法运算符(\) 两数相除,返回的商取其整数部分。 Is 运算符 比较两个对象引用变量。 ...

    C语言程序设计题库 第六章:函数

    扩展阅读:反斜线可能引发的bug宏定义不是语句,在行末不必加分号,如加上分号则连分号一起被置换宏名在源程序中若用引号括起来, 则预处理程序不对其作宏替换,例如printf函数的参数中,双引号内的宏名不会被替换 ...

    vb Script参考文档

    InStrRev 函数 返回一个字符串在另一个字符串中出现的位置,是从字符串的末尾算起。 Int 函数 返回数的整数部分。 整数除法运算符(\) 两数相除,返回的商取其整数部分。 Is 运算符 比较两个对象引用变量。 ...

    VBScript 语言参考

    InStrRev 函数 返回一个字符串在另一个字符串中出现的位置,是从字符串的末尾算起。 Int 函数 返回数的整数部分。 整数除法运算符(\) 两数相除,返回的商取其整数部分。 Is 运算符 比较两个对象引用变量。 ...

    VBSCRIP5 -ASP用法详解

    InStrRev 函数 返回一个字符串在另一个字符串中出现的位置,是从字符串的末尾算起。 Int 函数 返回数的整数部分。 整数除法运算符(\) 两数相除,返回的商取其整数部分。 Is 运算符 比较两个对象引用变量。 ...

    Python中字符串的格式化方法小结

    Python2.6之前,格式字符串的使用方法相对更简单些,虽然其能够接收的参数数量有限制。这些方法在Python3.3中仍然有效,但已有含蓄的警告称将完全淘汰这些方法,目前还没有明确的时间进度表。 格式化浮点数: pi = ...

Global site tag (gtag.js) - Google Analytics