有大量的sql语句需要解析,要求提取出表名。用正则表达式好像不太好,里面有一些较复杂的语句。想用sql解析器来解析,生成一棵语法树,提取出表名就可以了,这样结果也准确些。
我用了gsp(General SQL Parser,http://www.sqlparser.com)。但是平均解析一条语句要173ms,速度上有些慢了。gsp里面也没有一些选项,可以关闭某些特性,提高解析速度,因为我只要表名就可以了。各位有什么好的方法吗?开源库最好是java版的。

解决方案 »

  1.   

    如果这些表名是已知的,少量的
    那你可以把这些表名放在数组里,然后循环indexOf判断下
      

  2.   

    如果只是提取表用 java试试啊  查到 from 后面的就是表名和别名呗
      

  3.   

    表名未知,每次扫描一条sql语句,提取表名。语句有很复杂的,包括join、存储过程之类的。自己写有点不太现实,正则的话也没法匹配所有情况。建立语法树正确率可以高一点。
    问题是我找的gsp有点慢了,或者是我不知道它内部有哪些参数,可以优化。
      

  4.   

    表名都在from后面,提取from后面的就行了。
    大致想了下几种情况,大家补充。
    from table1
    from table1 tb1
    from table1, table2
    from table1 tb1, table2 tb2
    from table1, table2 tb2
    ...
    解析这样的字符串应该不麻烦吧。
      

  5.   

    你可以直接联系gsp作者要求帮助。
      

  6.   

    为什么大家都觉得表名就在from后面呢,不是只有select这一种语句呀。楼上的建议不错,我可以写信去问问。
      

  7.   

    create table 表名
    select * from 表名
    insert into 表名
    delete from 表名
    update 表名
    select * from 表名 inner(left\right) join 表名
    truncate table 表名
    drop table 表名其他的我想不出来了。总结一下,我觉得比研究什么语法树简单多了吧。
      

  8.   

    我们这个就有这种需求,必须在应用中对数据库操作记录日志,而不是记录业务日志!不能使用数据库去记录,这样就只有去解析sql语句,使用代理JDBC中的一些对象去搞了~~~真烦人啊!
      

  9.   

    如果使用的是 oracle 
    可以在jvm参数中加上 -Doracle.jdbc.Trace=true 就可以记录数据库操作了。
      

  10.   

    呵呵,
    我现在还要用 c 从sql 中提取表名,奋斗中~
      

  11.   

    词法语法解析么,用antlr,应该能找到现成的语法文件hibernate似乎就是用这个来解析hql的吧