如何使用正则表达式选择SQL的列名和表
本文关键字:SQL 何使用 正则表达式 选择 | 更新日期: 2023-09-27 18:17:59
我有一个SQL字符串,看起来像这样:
SELECT
USER."ID", USER."NAME", USER."BIRTH",USER."GENDER",
PACKAGE."type"
PACKAGE."code"
FROM
"DBNAME"."USER" USER,
"DBNAME2"."PACKAGE" PACKAGE
WHERE
USER."PACKAGE_ID" = PACKAGE."ID"
ORDER BY
USER."NAME";
我应该如何在c#中编写正则表达式以提取SELECT和FROM关键字之间的所有列名,然后提取FROM子句中的表名?
期望的输出应该找到这些,以便我可以将它们放入List
以循环:
ColumnsList:
USER."ID"
USER."NAME"
USER."BIRTH"
USER."GENDER"
PACKAGE."type"
PACKAGE."code"
TablesList:
"DBNAME"."USER" USER
"DBNAME2"."PACKAGE" PACKAGE
使用这个正则表达式将获得列和表名:
(?is)SELECT(.*?)(?<!'w*")FROM(?!'w*?")(.*?)(?=WHERE|ORDER|$)
- 组[1]:列
- Group[2]:表名
代码示例:
string sql=@"SELECT
USER.""ID"", USER.""NAME"", USER.""BIRTH"",USER.""GENDER"",
PACKAGE.""type""
PACKAGE.""code""
FROM
""DBNAME"".""USER"" USER,
""DBNAME2"".""PACKAGE"" PACKAGE
WHERE
USER.""PACKAGE_ID"" = PACKAGE.""ID""
ORDER BY
USER.""NAME"";";
var reg=new Regex(@"(?is)SELECT(.*?)(?<!'w*"")FROM(?!'w*?"")(.*?)(?=WHERE|ORDER|$)");
var colunms=reg.Match(sql).Groups[1].Value.Split(new char[]{','},StringSplitOptions.RemoveEmptyEntries);
var tables=reg.Match(sql).Groups[2].Value.Split(new char[]{','},StringSplitOptions.RemoveEmptyEntries);