javascript regex从joinsql查询中获取表名

r9f1avp5  于 2021-06-20  发布在  Mysql
关注(0)|答案(3)|浏览(259)

我有个问题:

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

使用regex,我只想从查询字符串中得到表名
我尝试使用正则表达式:

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

它成功地获取了“from”之后的第一个表名,但跳过了第二个表名,并获取了第三个表名。
当前组:[组1:“tsql”,组2:“tscl”]
目标群体:[第1组:“tsql”,第2组:“tswl”,第3组:“tscl”]。。。依此类推,直到chain join查询的姓氏为止
任何帮助都将受到感激!

bq3bfh9z

bq3bfh9z1#

您当前的表达式不考虑from/join关键字的可能重复。
您可以尝试以下表达式:

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

请在这里亲自试一试:https://regex101.com/r/qq1rvs/1
这里使用的正向lookback(?<=…)允许捕获它后面的任何单词(\w+)。在本例中,这些关键字后面的每个表名都由该表达式捕获。

mepcadol

mepcadol2#

你可以试试这个:

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" ]
eni9jsuy

eni9jsuy3#

注意:由于lame regexp解析器,这里讨论的regexp在大多数mysql版本上都不起作用。
问题:
空白 from 或者 join 用于注解、字符串或列名等(我不讨论这个问题)
表名周围可能存在的错误。-处理好了,但有个窃听器
backtica内部的标点符号--未处理
允许在表名周围加引号的可能设置(未处理)
子查询/ UNION --表名将集中在一起,而不考虑这些名称。
与from/join相对的标点符号-- FROM a JOIN(b JOIN c) --部分(?)处理
派生表 FROM ( SELECT ... ) --未处理
案例( fromFROM )--在这个regexp的scipe之外 LEFT OUTER JOIN --没问题
因此,这将主要处理一个表名:

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

如果js有一种方法可以遍历一个字符串,继续它停止的地方,那么您就可以得到它们。
要更好地处理背景和标点符号,请执行以下操作:

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

但是当背部抽搐发生时,你需要脱掉它。

相关问题