Regex从C#中的复杂SQL SELECT中提取字段
本文关键字:SELECT 提取 字段 SQL Regex 复杂 | 更新日期: 2023-09-27 18:24:51
我正在寻找一个正则表达式(我认为这是最好的方法),它将从复杂的SQL SELECT查询中提取字段。
select A.field1, A.field2, (B.field1 + ', ' + B.field2), (SELECT C.field1 FROM C_table AS C WHERE C.Id = A.Id) from A_table as A join B_Table as B ON B.AId = A.Id
或者类似疯狂的事情。
输出[]应为:
- A.字段1
- A.字段2
- (B.field1+','+B.field2)
- (从C_table AS C中选择C.field1,其中C.Id=A.Id)
我已经做了一个代码来检索SELECT和FROM 之间的字段
A.field1, A.field2, (B.field1 + ', ' + B.field2), (SELECT C.field1 FROM C_table AS C WHERE C.Id = A.Id)
因此,除了括号中的逗号之外,可以在每个逗号处进行除法运算。。。
谢谢!
用正则表达式, (?![^'(]*?'))
拆分第二个字符串-在任何逗号上拆分,后跟一个空格,其中下一个右括号不在下一个左括号之前(如果有的话)。
string[] output = Regex.Split(select_clause, ", (?![^'(]*?'))");
其中select_clause是从select和from
您可以使用以下regex来执行您想要的
/'([^'(]*')|(['w_]+'.)*['w_]*/
它匹配开头的parens和结尾parens旁边的任何内容,或多个标识符('w_
)和点。如果您需要支持更奇特的表标识符(如[Fancy identifier with spaces and brackets].Table.Field1
),则需要对其进行调整,但它应该适用于您的问题。
这将使用捕获组。
(?<=选择)?(?=,)|?(?=,)|(.*?)
这应该得到select之后的任何内容,直到字符串结束,该字符串介于2个逗号(,)之间,以及介于开括号和闭括号之间的任何内容。这将适用于.net regex,我认为您正在将其与c#代码一起使用。
如果您知道它已经是一个有效的查询:
([^'",]+|(["'])((?!'2).|'''2)*'2)+
只要您不使用任何集合,这将适用于MySQL,但根本不使用TSQL。它分为两部分:
[^'",]+ Any number of characters that are not ', ", or a comma.
或
(["'])((?!'2).|'''2)*'2 A string. (delimited by double or single quotes).
如果你包含集合,你就把它变成了一种非正则语言,因为你必须计算括号的深度。