【问题标题】:Javascript Regex to get table name from join sql queryJavascript 正则表达式从连接 sql 查询中获取表名
【发布时间】:2018-08-01 12:25:50
【问题描述】:

我有一个问题:

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”] 以此类推,直到链连接查询的姓氏

我们将不胜感激!

【问题讨论】:

标签: javascript mysql sql regex


【解决方案1】:

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

你可以试试这个表达方式:

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

请在此处亲自尝试:https://regex101.com/r/qQ1rvs/1

这里使用的正向lookbehind (?

【讨论】:

    【解决方案2】:

    注意:这里讨论的正则表达式不适用于大多数版本的 MySQL,因为蹩脚的正则表达式解析器。

    问题:

    • 空白
    • fromjoin 用于注释、字符串或列名等。(我不会解决这个问题。)
    • 表名周围可能有反引号。 -- 已处理,但有错误
    • backtica 中的标点符号 -- 未处理
    • 允许在表名周围加上引号的可能设置(未处理)
    • Subqueries/UNION -- 表名将被集中在一起而不考虑这些。
    • 对 from/join 的标点符号 -- FROM a JOIN(b JOIN c) -- 部分(?)处理
    • 派生表FROM ( SELECT ... ) -- 未处理
    • 大小写(from vs FROM)——在这个正则表达式的范围之外
    • LEFT OUTER JOIN -- 没问题

    所以,这将主要处理一个表名:

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

    如果 JS 有办法遍历一个字符串,从它停止的地方继续,那么你可以得到它们。

    为了更好地处理反引号和标点符号:

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

    但你需要在它们发生时去掉它们。

    【讨论】:

      【解决方案3】:

      你可以试试这个:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-05-16
        • 1970-01-01
        • 2015-12-20
        • 2022-09-27
        • 1970-01-01
        • 2013-10-14
        • 2019-08-20
        相关资源
        最近更新 更多