我已经搜索过高低,我真的很难找到合适的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
我觉得我很接近,但我需要一些指导。任何建议表示赞赏。
答案 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+
- 除了空白和逗号[^\s,]+
- 一个可选的子字符串,如(?:\([^()]*\))?
(一个(...)
,然后是除(
和(
以外的0 +字符,然后是{{1 }}))
- 逗号)
- 0+空白字符,
- 匹配重置运算符,丢弃到目前为止匹配的文本(因此,\s*
将从匹配中省略,但匹配时需要这样做)\K
- 除了空格和SELECT abc, Contains(...),
[^\s,]+
- 0+空白字符,
- 要么
\s*
- 任何标点符号或符号字符,但(?:(?![()',])[[:punct:]]|AS)
,(?![()',])[[:punct:]]
,(
和)
'
- 或,
- 文字|
子字符串AS
- 0+ whitespaces AS
- 除逗号之外的零个或多个字符,而不是\s*
字符序列(tempered greedy token} (?:(?!FROM)[^,])*
- 后面没有单词char。