就是想用正则表达式,但又不太熟悉, 执行String[] Table = sql.replaceAll(".*from *([^ ]*)[^,]*, *(*([^ ]*).*from *([^ ]*)","$1\t$2\t$3").split("\t")后,报了下面的异常 Exception in thread "main" java.util.regex.PatternSyntaxException: Dangling meta character '*' near index 24 .*from *([^ ]*)[^,]*, *(*([^ ]*).*from *([^ ]*) ^ at java.util.regex.Pattern.error(Pattern.java:1578) at java.util.regex.Pattern.sequence(Pattern.java:1695) at java.util.regex.Pattern.expr(Pattern.java:1595) at java.util.regex.Pattern.group0(Pattern.java:2347) at java.util.regex.Pattern.sequence(Pattern.java:1623) at java.util.regex.Pattern.expr(Pattern.java:1595) at java.util.regex.Pattern.compile(Pattern.java:1328) at java.util.regex.Pattern.<init>(Pattern.java:1084) at java.util.regex.Pattern.compile(Pattern.java:810) at java.lang.String.replaceAll(String.java:2038) at sql.TestExcel.main(TestExcel.java:44)
不会正则,我想的话还是和楼上的兄弟一样的. 查找所有在 from 后面 where 之前的就是你需要的.如果整个程序可由你控制的话,你在拼sql之前就应该把整个sql拆分成" select "+Str1+ " from "+Str2+" where 1=1 "+Str3+Str4 Str1:你需要select的字段 Str2:查找的表 Str3:where条件 Str4:排序 order by方便以后操作
如果没有表的别名 那就直接找from关键字后的n个单词 from table1,table2,table3 所取得字符串再以逗号为分隔符split
String[] Table = sql.replaceAll(".*from *([^ ]*)[^,]*, *(*([^ ]*).*from *([^ ]*)","$1\t$2\t$3").split("\t")
执行String[] Table = sql.replaceAll(".*from *([^ ]*)[^,]*, *(*([^ ]*).*from *([^ ]*)","$1\t$2\t$3").split("\t")后,报了下面的异常
Exception in thread "main" java.util.regex.PatternSyntaxException: Dangling meta character '*' near index 24
.*from *([^ ]*)[^,]*, *(*([^ ]*).*from *([^ ]*)
^
at java.util.regex.Pattern.error(Pattern.java:1578)
at java.util.regex.Pattern.sequence(Pattern.java:1695)
at java.util.regex.Pattern.expr(Pattern.java:1595)
at java.util.regex.Pattern.group0(Pattern.java:2347)
at java.util.regex.Pattern.sequence(Pattern.java:1623)
at java.util.regex.Pattern.expr(Pattern.java:1595)
at java.util.regex.Pattern.compile(Pattern.java:1328)
at java.util.regex.Pattern.<init>(Pattern.java:1084)
at java.util.regex.Pattern.compile(Pattern.java:810)
at java.lang.String.replaceAll(String.java:2038)
at sql.TestExcel.main(TestExcel.java:44)
对应楼主这个例子String regex = "(?<=from\\s)(\\w+)(\\s)|,(\\w+)\\s(as\\s\\w+\\s)on";应该就可以解决如果要处理所有的情况,我觉得应该把该数据库的SELECT语句的语法转成正则,还需要用一个循环来匹配(因为这时表名匹配的位置是不确定的)PS:
为便于处理,上例默认各字符串仅用一个空格分隔;
可以用sql = sql.replaceAll("\\s+", " ");来达到这个效果
查找所有在 from 后面 where 之前的就是你需要的.如果整个程序可由你控制的话,你在拼sql之前就应该把整个sql拆分成" select "+Str1+ " from "+Str2+" where 1=1 "+Str3+Str4
Str1:你需要select的字段
Str2:查找的表
Str3:where条件
Str4:排序 order by方便以后操作
from table1,table2,table3
所取得字符串再以逗号为分隔符split