使用REGEX在查询中获取别名列

时间:2018-02-24 17:09:09

标签: php mysql regex

我已经搜索过高低,我真的很难找到合适的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

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

1 个答案:

答案 0 :(得分:1)

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

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

val A = new RowMatrix(sparkContext.parallelize(Seq(
    Vectors.dense(1, 2, 3),
    Vectors.dense(4, 5, 6))))

请参阅regex demo

这是它的作用:

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