insert语句是必须包含vales关键字(就我的认知),insert语句示例:
<1>. insert into test2021 values('a');
<2>. insert into test2021 values('A', 'B', 'C', 4, '你好, 我是某某某, 你是');
怎么使用Java获得insert语句中values的每一个值呢?
首先我们还是比较容易将insert语句从values关键字分为两段。
得到最后一段即包含有插入值的,('A', 'B', 'C', 4, '你好, 我是某某某, 你是');替换掉左右括号()和分号;
剩下'A', 'B', 'C', 4, '你好, 我是某某某, 你是'
我们再用.split(",")分割成数据。这里需要注意一个问题,当插入的值里面有道号,时这样是有问题的,
比如insert语句示例2中的'你好, 我是某某某, 你是',本来是一句话,会因为.split(",")分离了,所以我们就要处理这种情况。
代码如下:
public static void main(String[] args) {
String testStr = "'A', 'B', 'C', 4, '你好, 我是某某某, 你是'";
getValue(testStr);
}
public static void getValue(String testStr) {
String[] strList = testStr.split(",");
String columnValue = "";
for (int i = 0; i < strList.length; i++) {
columnValue = strList[i];
int startIndex = 0;
int endIndex = 0;
if (strList[i].trim().startsWith("'")) {
startIndex = i;
endIndex = i;
int count = 0;
while (true) {
count++;
if (endIndex < strList.length - 1) {
if (strList[++endIndex].contains("'")) {
if (strList[endIndex].trim().startsWith("'")) {
break;
}
} else {
if (strList[startIndex].trim().endsWith("'")) {
break;
}
}
}
if (++endIndex == strList.length) {
if (strList[(endIndex - 1) - 1].trim().endsWith("'")) {
break;
} else {
if (!strList[endIndex - 1].trim().startsWith("'")) {
++endIndex;
break;
}
}
}
// 防止死循环
if (count == 1001) {
break;
}
}
System.out.println("count=" + count);
}
if (endIndex - 1 > startIndex) {
for (int j = startIndex + 1; j < endIndex - 1; j++) {
columnValue = columnValue + "," + strList[j];
}
// 跳过合并的,计算为(endIndex - 1)再减去for循环i自增的1
i = (endIndex - 1) - 1;
}
System.out.println("value=" + columnValue);
}
}
这样columnValue就会得到原来的值。
更新--2021-10-27
以上的方法是有bug,对于一些特殊的value还是会识别不出来,所以我决定换一个思路去获取insert语句中values的每个值。以下是Java代码
public static List<String> getTableColumnValueByMatchingSingleQuotes(String[] targetArray) {
List<String> tableColumnValueList = new ArrayList<>();
String columnValue = "";
for (int i = 0; i < targetArray.length; i++) {
columnValue = targetArray[i];
int startIndex = i;
int endIndex = i;
boolean result = judgeMatchingSingleQuotes(columnValue);
System.out.println(columnValue + " result: " + result);
// 逻辑处理
if (!result) {
// false
endIndex = getMatchingSingleQuotesIndex(targetArray, ++i);
}
if (endIndex != startIndex && endIndex != -999) {
for (int j = startIndex + 1; j <= endIndex; j++) {
columnValue = columnValue + "," + targetArray[j];
}
// Set i = endIndx
i = endIndex;
}
System.out.println("column value = " + columnValue);
tableColumnValueList.add(columnValue);
}
return tableColumnValueList;
}
public static int getMatchingSingleQuotesIndex(String[] targetArray, int startIndex) {
for (int i = startIndex; i < targetArray.length; i++) {
boolean result = judgeMatchingSingleQuotes(targetArray[i]);
if (result) {
++startIndex;
} else {
return startIndex;
}
}
return -999; // default value
}
/**
* Judge single quotes is matching or not
*
* @param target strings that need to count single quotes
* @return if the count of single quotes is singular, return false, otherwise return true
*/
public static boolean judgeMatchingSingleQuotes(String target) {
char[] chars = target.toCharArray();
int quotesCount = 0;
for (int i = 0; i < chars.length; i++) {
if (chars[i] == '\'') {
++quotesCount;
}
}
return quotesCount % 2 == 0;
}
测试代码:
public static void main(String[] args) {
String str = "'ABCD', 'EFG','HIJK','LMNOPQ','abc ''def (ghij, ''klmn'', ''kokoio'')','uuywe','fasf','N'";
getTableColumnValueByMatchingSingleQuotes(str.split(","));
}
简单说一下思路,insert语句里的每个value如果是字符,都会带有单引号而且是成对的,利用这个特点去判断分割(str.split(","))后每个元素所包含的单引号是否匹配即成对,不匹配就记录当前字符的startIndex,再去查找下一个不匹配的字符并记录endIndex,这个startIndex到endIndex(包括本身)合起来就是一个完整的value。结合代码看容易理解点,有什么问题都可以在评论处提问。