使用正则表达式从源代码中提取SQL查询

时间:2015-05-18 01:48:54

标签: sql regex

我正在尝试维护其他人的代码,并希望将它们整理好,并找出文件与数据库中的表之间的关系。 我有很多ASP文件,其中大部分使用VB脚本。我想从文件中提取SQL查询。我的想法是使用正则表达式,但我似乎无法找到正确的模式使用。 (或者我可能只是没有用正确的关键词搜索?)

例如,我有以下代码:

sql="select id from employee where no='"&no&"'"
rs.Open sql,smoothconn,adOpenStatic,adLockReadOnly 
if not rs.EOF then
  if sql1 <> "" then
    sql1 = sql1 & " or "
  end if     
  sql1 = sql1 & " (a.id='"&rs("id")&"')"
end if
rs.Close

chgdate = ""
sqlh = ""
sql="select a.chg, b.oldvalue, e.enter from employeechange a left join changeitem b on a.id=b.changeid " &_
  "left join employee e on a.id=e.id " &_
  "where (e.no like '"&no&"%' or e.name like '"&no&"%' or e.name1 like '"&no&"%') and b.field='id' " &_
  "order by a.chg "
'Response.Write sql & "<br>"    

我想在此代码中获取SQL查询。我想至少得到以下内容:

select id from employee where no='"&no&"'

"select a.chg, b.oldvalue, e.enter from employeechange a left join changeitem b on a.id=b.changeid " &_
  "left join employee e on a.id=e.id " &_
  "where (e.no like '"&no&"%' or e.name like '"&no&"%' or e.name1 like '"&no&"%') and b.field='id' " &_
  "order by a.chg "

基本上,我需要知道动作(INSERT / UPDATE / DELETE)和所涉及的表。

在生成模式时,我认为以下是一些重要事项:

1. can be INSERT, UPDATE, or DELETE
2. sql in string concatanation, and can be single-line or multi-line
3. no upper limits of number of tables involved (joined)
4. select can be * or specific column(s)

以下是一些模式,但它们似乎都没有正常工作。

(SELECT|UPDATE|INSERT)[\s\S]+?\;\s*?$
(INSERT INTO|UPDATE|SELECT|DELETE)(?:[^;]|(?:'.*?'))+;\\s*
(SELECT|UPDATE|INSERT)[\s\S]+?\;\s*?$

我真的很感激帮助。

1 个答案:

答案 0 :(得分:0)

此巨像适用于您的样本输入以及删除和插入:

/"(?:(select)(?:[^"]|"(?=[ \n\r\w]))*?from (\w+)(?:(?:[^"]|"(?=[ \n\r\w]))*?join (\w+))?(?:(?:[^"]|"(?=[ \n\r\w]))*?join (\w+))?(?:(?:[^"]|"(?=[ \n\r\w]))*?join(\w+))?(?:(?:[^"]|"(?=[ \n\r\w]))*?join (\w+))?|(update) (\w+)|(delete) from (\w+)|(insert) into (\w+)).*?"(?=[\n\r])/im

请参阅live demo

它通过在引号之间不情愿地匹配来工作,其中开头引号后跟一个sql命令字,结束引号后面跟一个换行符,并使用“ignore case”标志(匹配“SELECT”和“select” )和“全点”标志(并允许匹配流过线)。

SQL操作/动词是第一个非空白组,受影响的各个表在紧跟动词的组中捕获。这最多可以处理4个连接 - 只需添加更多的连接匹配副本,即可以捕获更多的连接表。