有这样一个串
Read([SQLServer#10.5.219.21#mas_db],[select * from material where machine_seq='!dbo.repair.machine_seq' and b='@@dbo.test.cc' and c='!!dbo.test.dd' and d='@dbo.repair' and e='sd.bf' and f='@aa.bg' and g='#dbo.repair.machine_name' and h=@dbo.repair.owner],[en_US])
需要解析中间的select * from material where machine_seq='!dbo.repair.machine_seq' and b='@@dbo.test.cc' and c='!!dbo.test.dd' and d='@dbo.repair' and e='sd.bf' and f='@aa.bg' and g='#dbo.repair.machine_name' and h=@dbo.repair.owner
还需要满足'@@','@','!'(前后包含单引号),的变量取出来
@schema.table.fieldName @dbo.repair.machine_seq要点:获取界面上某个控件录入的值;
#schema.table #dbo.reapir要点:获取这个表的记录行数;
!schema.table.fieldName !dbo.repair.qty要点:统计dbo.repair表qty总和. 相当于Sum(qty)性质.
@@constName @@User_ID要点:获取内存变量值;
实现如下:
package com.lenovo.nabf.util;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class NabfUtilTest {
public static final Pattern PatternSql = Pattern.compile("\\'(([#!]{1}|[@]{1,2})[\\w\\.]+?)\\'"); // match '@dbo.repair.machine_seq'
public static final Pattern PatternReadString = Pattern.compile(".+?,\\[([\\w\\.\\s{*!@#=\'}]+?)\\],.+?"); //match Read([db],[sqlstring],[lang])得到sqlstring的值
public static void main(String args[]){
String readString="Read([SQLServer#10.5.219.21#mas_db],[select * from material where "
+ "machine_seq='!dbo.repair.machine_seq' and b='@@dbo.test.cc' "
+ "and c='!!dbo.test.dd' and d='@dbo.repair' and e='sd.bf' and f='@aa.bg' "
+ "and g='#dbo.repair.machine_name' and h=@dbo.repair.owner],[en_US])";
System.out.println(readString);
System.out.println(analysisReadStr(readString));
List list=NabfUtil.getRegexMatchedList(readString);
for(String s:list){
System.out.println(s);
}
String sqlString = NabfUtil.getStringByAnalysisReadString(readString);
System.out.println(sqlString);
}
public static ArrayList getRegexMatchedList(String readString){
String sqlString = analysisReadStr(readString);
ArrayList matchList=new ArrayList();
Matcher matcher = PatternSql.matcher(sqlString);
int lastEndIndex = 0;
while (matcher.find(lastEndIndex)) {
matchList.add(matcher.group(1));
lastEndIndex = matcher.end();
}
return matchList;
}
public static String getStringByAnalysisReadString(String readString){
String sqlString = analysisReadStr(readString);
Matcher matcher = PatternSql.matcher(sqlString);
StringBuilder sb = new StringBuilder();
int lastEndIndex = 0;
while (matcher.find(lastEndIndex)) {
sb.append(sqlString.substring(lastEndIndex, matcher.start()));
lastEndIndex = matcher.end();
}
sb.append(sqlString.substring(lastEndIndex));
return sb.toString();
}
private static String analysisReadStr(String readString){
Matcher matcher = PatternReadString.matcher(readString);
int lastEndIndex = 0;
String sqlString="";
while (matcher.find(lastEndIndex)) {
sqlString=matcher.group(1);
lastEndIndex = matcher.end();
}
return sqlString;
}
}