C# 如何使用正则表达式选择SQL的列名和表?

C# 如何使用正则表达式选择SQL的列名和表?,c#,sql,.net,regex,C#,Sql,.net,Regex,我有一个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";

我有一个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子句中的表名

预期的输出应该会找到这些,以便我可以将它们放入列表中进行循环:

专栏列表:

USER."ID"
USER."NAME"
USER."BIRTH"
USER."GENDER"
PACKAGE."type"
PACKAGE."code"
表列表:

"DBNAME"."USER" USER
"DBNAME2"."PACKAGE" PACKAGE

使用此正则表达式将获得列和表名:

  (?is)SELECT(.*?)(?<!\w*")FROM(?!\w*?")(.*?)(?=WHERE|ORDER|$)
第[1]组: 柱 组[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);

使用此正则表达式将获得列和表名:

  (?is)SELECT(.*?)(?<!\w*")FROM(?!\w*?")(.*?)(?=WHERE|ORDER|$)
第[1]组: 柱 组[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);

你能举一个所需输出的例子吗?使用lexer比regex更容易解析SQL。regex是这类事情中最被误用的工具。你需要一个解析器@hjpotter92的lexer可能不够。签出此impl。这可能更符合您当前的需求,但会很好地适应未来的需求。查询将变得复杂,您可能需要的不仅仅是列名和表名。@好奇很遗憾,codeproject的实现目前不支持select子句:你能举一个所需输出的例子吗?使用lexer比regex更容易解析SQL。regex是这类事情中最被误用的工具。你需要一个解析器@hjpotter92的lexer可能不够。签出此impl。这可能更符合您当前的需求,但会很好地适应未来的需求。查询将变得复杂,您可能需要的不仅仅是列名和表名。@好奇很遗憾,codeproject的实现目前不支持select子句:谢谢这个很有效。除了我意识到,对于包含单词FROM的列名的SQLs,将导致错误提取。说选择用户。从_COUNTRY…,这将导致正则表达式中断。感谢更新。但它似乎仍然不起作用。我有一个类似于select USER.TRAVEL\u FROM\u COUNTRY的查询。。。由于FROM关键字,正则表达式将在TRAVEL_uu之后立即停止。@Carven test USER.TRAVEL_ufrom_ucountry使用我的正则表达式,效果很好。你可以列出你的测试sql,然后我可以调试我的正则表达式代码。。我意识到发生了什么。在我拥有的一些SQL文件中,它们周围可能没有引号。所以,它们看起来像USER.TRAVEL\u FROM\u COUNTRY或USER.FROM\u COUNTRY。这将导致问题。有引号的可以,但没有引号的不行。“我怎么才能解决这个问题?”卡文:当你问问题时,你应该列出你所有的遗憾。这是最后一次更新:?isSELECT.*?谢谢!这个很有效。除了我意识到,对于包含单词FROM的列名的SQLs,将导致错误提取。说选择用户。从_COUNTRY…,这将导致正则表达式中断。感谢更新。但它似乎仍然不起作用。我有一个类似于select USER.TRAVEL\u FROM\u COUNTRY的查询。。。由于FROM关键字,正则表达式将在TRAVEL_uu之后立即停止。@Carven test USER.TRAVEL_ufrom_ucountry使用我的正则表达式,效果很好。你可以列出你的测试sql,然后我可以调试我的正则表达式代码。。我意识到发生了什么。在我拥有的一些SQL文件中,它们周围可能没有引号。所以,它们看起来像USER.TRAVEL\u FROM\u COUNTRY或USER.FROM\u COUNTRY。这将导致问题。有引号的可以,但没有引号的不行。“我怎么才能解决这个问题?”卡文:当你问问题时,你应该列出你所有的遗憾。这是最后一次更新:?isSELECT.*??