gpt4 book ai didi

php - 使用 REGEX 获取查询中的别名列

转载 作者:行者123 更新时间:2023-11-29 02:42:21 24 4
gpt4 key购买 nike

我到处搜索,真的很难找到合适的 REGEX 来帮助我检索我想要的东西。假设我有以下查询字符串:

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

我想要一个 REGEX 来提取逗号之间的所有内容,其中有一个空格或一个“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

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

最佳答案

用一个正则表达式处理 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+ 个字符
    • (?:\([^()]*\))? - 一个可选的子字符串,例如 (...)(a (,然后是 () 以外的 0+ 个字符,然后是 ))
    • , - 逗号
  • \s* - 0+ 个空白字符
  • \K - 匹配重置运算符丢弃目前匹配的文本(因此,SELECT abc, Contains(...), 将从匹配中省略,但比赛需要)
  • [^\s,]+ - 除了空格和 ,
  • 之外的 1 个或多个字符
  • \s* - 0+ 个空白字符
  • (?:(?![()',])[[:punct:]]|AS) - 或者
    • (?![()',])[[:punct:]] - 除了 (, ), ',
    • | - 或者
    • AS - 文字 AS 子串
  • \s* - 0+ 个空格
  • (?:(?!FROM)[^,])* - 除逗号之外的零个或多个字符不以 FROM 字符序列开始(它是一个tempered greedy token )
  • (?!\w) - 后面没有字符字符。

关于php - 使用 REGEX 获取查询中的别名列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48965423/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com