如果不带别名的话,可以就正则实现.
不过java的正则有些限制,所以对于from中多于10张表的就有问题了,不多可以自己在添加,考虑不是很完善
Stringstr="INSERTINTOA\n"+"SELECTB.B1,B.B2,C.C1,C.C2\n"+"FROMBINNERJOINCONB.B0=C.C0\n"+"WHEREB.B0IN(SELECTD0FROMD,E,G,HWHERED.D1=E.E1)\n";Patternp=Pattern.compile("(?i)(?<=(?:from|into|update|join)\\s{1,1000}"+"(?:\\w{1,1000}(?:\\s{0,1000},\\s{0,1000})?)?"//重复这里,可以多个from后面的表+"(?:\\w{1,1000}(?:\\s{0,1000},\\s{0,1000})?)?"+"(?:\\w{1,1000}(?:\\s{0,1000},\\s{0,1000})?)?"+"(?:\\w{1,1000}(?:\\s{0,1000},\\s{0,1000})?)?"+"(?:\\w{1,1000}(?:\\s{0,1000},\\s{0,1000})?)?"+"(?:\\w{1,1000}(?:\\s{0,1000},\\s{0,1000})?)?"+"(?:\\w{1,1000}(?:\\s{0,1000},\\s{0,1000})?)?"+"(?:\\w{1,1000}(?:\\s{0,1000},\\s{0,1000})?)?"+"(?:\\w{1,1000}(?:\\s{0,1000},\\s{0,1000})?)?"+"(?:\\w{1,1000}(?:\\s{0,1000},\\s{0,1000})?)?"+")(\\w+)");Matcherm=p.matcher(str);Listtables=newArrayList();while(m.find()){tables.add(m.group());}System.out.println(tables);
不过像楼上说的,最好还是自己写个sql解析器,可以采用javacc或者antlr来写,会容易些