String sql= "select a,b,c from table1 a1,table2 as a2 on a1.a = a2.b where d = select b from table3";我想把table1,table2,table3,从字符串sql中提取出来,请问有什么好的方法吗?

解决方案 »

  1.   

    用正则表达式:
    String[] Table = sql.replaceAll(".*from *([^ ]*)[^,]*, *(*([^ ]*).*from *([^ ]*)","$1\t$2\t$3").split("\t")
      

  2.   

    就是想用正则表达式,但又不太熟悉,
    执行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)
      

  3.   

    要对应所有情况的话貌似挺难的啊
    对应楼主这个例子String regex = "(?<=from\\s)(\\w+)(\\s)|,(\\w+)\\s(as\\s\\w+\\s)on";应该就可以解决如果要处理所有的情况,我觉得应该把该数据库的SELECT语句的语法转成正则,还需要用一个循环来匹配(因为这时表名匹配的位置是不确定的)PS:
    为便于处理,上例默认各字符串仅用一个空格分隔;
    可以用sql = sql.replaceAll("\\s+", " ");来达到这个效果
      

  4.   

    最笨的办法:将sql语句分词,变成一个一个的单词,然后再使用查询:select * from all_all_tables t where t.table_name in ();其中括号中就是分词的结果,就可以找到对应的表。
      

  5.   

    稍微好一些的办法,就是使用sql语法的分词,select, from, where在from后面,那么还是要加很多判断,逻辑挺复杂的,而且对sql的语法要全面地了解!
      

  6.   

    不会正则,我想的话还是和楼上的兄弟一样的.
    查找所有在  from 后面  where  之前的就是你需要的.如果整个程序可由你控制的话,你在拼sql之前就应该把整个sql拆分成" select "+Str1+ " from "+Str2+" where 1=1 "+Str3+Str4
    Str1:你需要select的字段
    Str2:查找的表
    Str3:where条件
    Str4:排序  order by方便以后操作
      

  7.   

    如果没有表的别名 那就直接找from关键字后的n个单词
    from table1,table2,table3
    所取得字符串再以逗号为分隔符split