【问题标题】:Getting alias columns in query using REGEX使用 REGEX 在查询中获取别名列
【发布时间】:2018-02-24 17:09:09
【问题描述】:

我搜索了高位和低位,真的很难找到合适的正则表达式来帮助我检索我想要的东西。假设我有以下查询字符串:

SELECT col, col2 AS c2, col3, col * col2 calc FROM...

我想要一个正则表达式,它可以提取逗号之间的所有内容,其中有空格或“AS”,然后是列别名。它还应该排除 SELECT 和 FROM。对于上面的示例,我想要以下匹配项:

col2 AS c2
col * col2 calc

本质上,这应该删除 col 和 col3,因为它们没有别名。我尝试了以下变体但没有成功(注意:$colname 包含别名):

/(SELECT|,)([^,]*{$colname}[^,]*)(FROM|,)/

目前这只返回:

, col2 AS c2,
col2 AS c2
, col2 AS c2,
col2 AS c2

我觉得我很接近,但我需要一些指导。任何建议表示赞赏。

【问题讨论】:

标签: php mysql regex


【解决方案1】:

用一个正则表达式处理 SQL 字符串解析几乎是不可能的,您应该寻找更通用的解决方案,例如 PHP-SQL-Parser

我提出的正则表达式是一种临时工作,可以进一步精确、调整等,以满足特定项目的需求:

(?:\G(?!\A),|SELECT)(?:\s+[^\s,]+(?:\([^()]*\))?,)*\s*\K[^\s,]+\s*(?:(?![()',])[[:punct:]]|AS)\s*(?:(?!FROM)[^,])*(?!\w)

请参阅regex demo

这是它的作用:

  • (?:\G(?!\A),|SELECT) - 上一次成功匹配的结束,在 (\G(?!\A),) 或 (|) 之后的逗号是 SELECT 子字符串
  • (?:\s+[^\s,]+(?:\([^()]*\))?,)* - 零个或多个序列 ((?:...)*):
    • \s+ - 1+ 个空格
    • [^\s,]+ - 除了空格和逗号之外的 1+ 个字符
    • (?:\([^()]*\))? - 一个可选子字符串,如 (...)(,然后是除 () 之外的 0+ 个字符,然后是 )
    • , - 逗号
  • \s* - 0+ 个空格字符
  • \K - 匹配重置运算符丢弃目前匹配的文本(因此,SELECT abc, Contains(...), 将从匹配中省略,但在匹配中是必需的)
  • [^\s,]+ - 除空格和 , 之外的 1 个或多个字符
  • \s* - 0+ 个空白字符
  • (?:(?![()',])[[:punct:]]|AS) - 要么
    • (?![()',])[[:punct:]] - 任何标点符号或符号字符,但 ()',
    • | - 或
    • AS - 文字 AS 子字符串
  • \s* - 0+ 个空格
  • (?:(?!FROM)[^,])* - 除了逗号之外的零个或多个字符不是以FROM 字符序列开头的(它是tempered greedy token
  • (?!\w) - 后面没有字符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-27
    • 1970-01-01
    • 1970-01-01
    • 2015-08-07
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 2013-08-20
    相关资源
    最近更新 更多