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

标签 php mysql regex

我进行了多次搜索,并且真的很难找到合适的正则表达式来帮助我检索我想要的内容。假设我有以下查询字符串:

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

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

最佳答案

用一个正则表达式处理 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) - 后面没有单词字符。

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

相关文章:

php - 获取最后插入的 ID 数组 mysql php

php - 我如何在 MySQL 的两个不同字段中使用两个变量进行搜索

javascript - 在错误消息中访问 ng-pattern

javascript - node.js & mysql - 如何获取最后插入的 ID?

javascript - 使用 PHP 和 AJAX 处理输入

python - 在python中使用正则表达式从 anchor 标记中提取数据

regex - 正则表达式,用于匹配某些数字

php - 在 Laravel 的 artisan 队列 :listen 中捕获 ProcessTimedOutException

php - 我应该在哪里获取 jet_browse_node_id 以用于 jet.com 市场文件上传 API 的以下 JSON 请求?

mysql - sql,计算每个事件祖先的 child 数量