现有一接口语句,用于数据集接口维护,其中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;
}


发表评论