假设我有这个查询
INSERT INTO `TABLENAME` VALUES(xxx,yyy,zzz);
我正在使用以下方法单独提取值
public String extractValues(String queryLine){
return queryLine.substring(queryLine.indexOf('(') + 1,queryLine.lastIndexOf(')'));
}
但是后来我意识到Insert query
可以采取以下形式:
INSERT INTO `TABLENAME` VALUES(xxx,yyy,zzz),(aaa,bbb,ccc);
现在如何提取值?
我在想也许regex
是继续分裂的道路,),(
但这似乎并不正确。如果其中一个价值观具有那些价值观呢?因此不确定。
请指导。
案件我正在努力处理
INSERT INTO `TABLENAME` VALUES(xxx,yyy,zzz),(aaa,'bb(,)b',ccc);
要求的输出: xxx,yyy,zzz and aaa,'bb(,)b',ccc
PS:值之间的逗号无关紧要
使用此方案通常可以解决识别支持char文字(必须从识别中排除)的语言中的某种模式:
我不知道如何使用单个语句或单个正则表达式来完成此操作。只是为了这个论点,我编写了以下代码。
import java.util.Arrays;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ValuesListParse {
public static void main(String[] args) {
String stmt = " INSERT INTO `TABLENAME` VALUES(xxx,yyy,zzz),(aaa,'bb),(b',ccc),(aaa,bbb,ccc); ";
System.out.printf("%s\n", stmt);
//extract values list
stmt = stmt.split("(?i)\\s+values\\s*\\(|\\);")[1];
System.out.printf("values list: %s\n", stmt);
// identify pattern between '' (char literal) and replace it with another pattern: the 2nd group is what we want
/* UPDATE modified regexp from ('.*)(\\)\\,\\()(.*') to ('\\w*)(\\)\\,\\()+(\\w*') to manage multiple literals containig the pattern */
Matcher m = Pattern.compile("('\\w*)(\\)\\,\\()+(\\w*')").matcher(stmt);
while (m.find()) {
stmt = stmt.substring(0, m.start(2)) + "###" + stmt.substring(m.end(2), stmt.length());
System.out.printf("values list with pattern subst inside char literal: %s\n", stmt);
}
// split multiple values
String[] multiValues = stmt.split("\\)\\,\\(");
// adjust char literal
for (int i = 0; i < multiValues.length ; i++) {
multiValues[i] = multiValues[i].replaceAll("###", "),(");
}
System.out.println(Arrays.toString(multiValues));
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句