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