获取查询的主要位置

时间:2012-06-25 06:27:04

标签: java regex

我想在Java中获取数据库查询的main where子句的索引? 我怎么能用Regex来处理这个?

例如,在此查询中,我想获得Second where子句:

  select u.id, (select x.id from XEntity where x.id = 200) 
  from UserEntity u 
  **where** u.id in (select g.id from AnotherEntity g where g.id = 100) 

我认为主要的位置是“(”字符和“)”字符在它之后是相等的。 但我不知道怎样才能用正则表达式来实现这个目标。

最诚挚的问候

2 个答案:

答案 0 :(得分:0)

正则表达式不是很擅长识别SQL查询这样复杂的结构。主要是因为SQL不是无上下文的,这正是你遇到的问题:WHERE可以出现在很多地方,你需要一个特别依赖于查询的整体结构。

您需要的是适当的解析器。 only JavaScript SQL parser I could find不是太完整,但您可以通过确保它符合您的需求来帮助开发它。

答案 1 :(得分:0)

Toote和David Brabant所说的绝对是正确的。解析SQL,尤其是仅使用正则表达式的复杂SQL是一个非常难的问题。

在解析Java中的SQL方面,这似乎是你问题的主旨,有一个非常好的(如果显然是未维护的)库called JSQLParser。可以在Github here上找到该库的更新版本(免责声明:我对此做了很少的贡献)。主页面显示了一个访问者的示例,旨在使用AST here的输出。

ANTLR available in it's grammar list还有一个语法。或者,如果您喜欢冒险,H2数据库支持相当广泛的SQL,包括MySQL的一些专有功能。您可以修改它Parser以生成用于提取所需信息的适当结构。