现有一接口语句,用于数据集接口维护,其中sql查询入参是使用的'${}'来标识的。在实际使用过程中,需要将sql中的参数全部提取出来,那应该如何处理呢?经过资料查询,发现并没有现成的API可以直接使用,所以,这个轮子得自己来造。效率问题暂时不考虑,先实现功能,再做优化。
实现思路:
1、参数值可能有多个,又是在字符串中,可以利用下标截取字符串的方式。
2、找到字符串中相同的关键字,如 '${ 和 }' ,利用两个下标值就能截取到实际的参数值
3、查询全部'${的下标生成集合,查询全部}'的下标生成集合
4、根据两个下标集合的一一匹配关系,截取字符串中的全部参数
代码实现:
1、查询一个字符串再另一个字符串中出现的下标
/** * 查询一个字符串再另一个字符串中出现的下标 * @param str * @param key * @return */ public static List<Integer> searchAllIndex(String str, String key) { List<Integer> allIndex=new ArrayList<Integer>(); int a = str.indexOf(key);//*第一个出现的索引位置 while (a != -1) { allIndex.add(a); a = str.indexOf(key, a + 1);//*从这个索引往后开始第一个出现的位置 } return allIndex; }
2、根据关键字 获取字符串中参数
/** * 根据关键字 获取字符串中参数 * @param string * @param keyStart 如'${ * @param keyEnd 如 }' * @return */ public static List<String> getKeyListFromString(String string,String keyStart,String keyEnd){ // 返回数据 List<String> allStringList=new ArrayList<String>(); // 判断不为空 if(StringUtils.isNotBlank(string)){ // 去空格 string = string.replaceAll("\\\\s*",""); // 开始keyIndex集合 List<Integer> firstIndex=searchAllIndex(string,keyStart); // 结束keyIndex集合 List<Integer> endIndex=searchAllIndex(string,keyEnd); // 不为空 if(CollectionUtils.isNotEmpty(firstIndex)){ // 循环 for(int i=0;i<firstIndex.size();i++){ // 截取关键字部分 String temp = string.substring(firstIndex.get(i)+keyStart.length(),endIndex.get(i)) ; // 添加到返回数据中 allStringList.add(temp); } } } return allStringList; }
发表评论