繁体   English   中英

Javascript正则表达式从联接SQL查询中获取表名

[英]Javascript Regex to get table name from join sql query

我有一个查询:

select a.id, a.nama, b.alamat from tsql as a join tswl as b on a.id = b.id join tscl as c on a.id=c.id

并使用正则表达式,我想从查询字符串得到表名。

我尝试使用正则表达式:

select.*from\s+(\w+).*join\s(\w+).*

哪个设法在“ from”之后获得第一个表名,但是跳过了第二个表名,而获得了第三个表名。
当前组:[组1:“ tsql”,组2:“ tscl”]

目标组:[组1:“ tsql”,组2:“ tswl”,组3:“ tscl”] ...依此类推,直到链连接查询的姓氏为止

任何帮助将不胜感激!

您当前的表达式未考虑from / join关键字的可能重复。

您可以尝试以下表达式:

(?<=from|join)\s+(\w+)

请在这里自己尝试: https : //regex101.com/r/qQ1rvs/1

在此处使用正向后视(?<= ...)可以捕获其后的任何单词(\\ w +)。 在这种情况下,这些关键字之后的每个表名都被该表达式捕获。

您可以尝试以下方法:

var query = 'select a.id, a.nama, b.alamat from tsql as a join tswl as b on a.id = b.id join tscl as c on a.id=c.id';
console.log(query.match(/(from|join)\s+(\w+)/g).map(e => e.split(' ')[1]))

输出:

Array(3) [ "tsql", "tswl", "tscl" ]

注意:由于the脚的regexp解析器,此处讨论的regexp不适用于大多数版本的MySQL。

问题:

  • 空格
  • fromjoin在注释或字符串或列名等使用(我不会解决这个。)
  • 有关表名的可能背景。 -已处理,但有错误
  • backtica内部的标点符号-未处理
  • 可能的设置允许在表名周围加引号(未处理)
  • 子查询/ UNION表名将被集中在一起,而不考虑这样。
  • 针对from / join的标点-FROM FROM a JOIN(b JOIN c) -部分(?)已处理
  • 派生表FROM ( SELECT ... ) -未处理
  • Case( from vs FROM )-在此正则表达式的提示之外
  • LEFT OUTER JOIN -没问题

因此,这将主要处理一个表名:

\b(FROM|JOIN)\s+\`?(\w+)\`?

如果JS有一种遍历字符串的方法,可以从中断处继续执行,那么您就可以全部获取它们。

为了更好地处理内部的背景符号和标点符号:

\b(FROM|JOIN)\s+(\w+|`[^`]+`)

但是您需要在背景知识出现时将其清除。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM