我必须从sql中获取tablename和columnnames。为此,我根据空间拆分了子句数据并将所有元素存储在列表中,但现在有些列具有方法调用或其他一些验证。
对于某些专栏:
max(TableName1.ColumnName1)
- > TableName1.ColumnName1
concat('Q',TableName2.ColumnName2)}
- > TableName2.ColumnName2
left(convert(varchar(90),TableName3.ColumnName3),1)})
- > TableName3.ColumnName3
现在我验证了。的字符串 在这里我只提示即(。)基于此我必须在特殊字符之前/之前得到正确和左边的字符串。
可能会获得,
(
)
答案 0 :(得分:2)
import java.util.*;
import java.text.*;
import java.util.regex.*;
public class Parser {
private static Pattern p = Pattern.compile("(?![\\(\\,])([^\\(\\)\\,]*\\.[^\\(\\)\\,]+)(?=[\\)\\,])");
private static String getColumnName(String s) {
Matcher m = p.matcher(s);
while(m.find()) {
return m.group(1);
}
return "";
}
public static void main(String []args) {
String s1= "max(TableName1.ColumnName1)";
System.out.println(getColumnName(s1));
String s2= "concat('Q',TableName2.ColumnName2)}";
System.out.println(getColumnName(s2));
String s3= "left(convert(varchar(90),TableName3.ColumnName3),1)})";
System.out.println(getColumnName(s3));
}
}
输出:
TableName1.ColumnName1
TableName2.ColumnName2
TableName3.ColumnName3
答案 1 :(得分:0)
您可以使用 [(),{}] 之类的正则表达式将数组拆分为标记,然后只需使用"选择标记。&#34 ; 登录。例如:
public static String getColumnName (String input) {
if (StringUtils.isEmpty(input)) return input;
String[] tokens = input.split("[(),{}]");
for (String token: tokens) {
if (token.contains(".")) return token;
}
return input;
}
public static void main(String args[]) throws Exception {
//The two tokens will be "max", "TableName1.ColumnName1".
String test1 = "max(TableName1.ColumnName1)";
//The three tokens will be "concat", "Q" and "TableName2.ColumnName2".
String test2 = "concat('Q',TableName2.ColumnName2)}";
//The six tokens will be "left", "convert", "varchar",
//"90", "", "1" and "TableName3.ColumnName3".
String test3 = "left(convert(varchar(90),TableName3.ColumnName3),1)})";
System.out.println(getColumnName(test1));
System.out.println(getColumnName(test2));
System.out.println(getColumnName(test3));
}
打印出来会给你:
TableName1.ColumnName1
TableName2.ColumnName2
TableName3.ColumnName3