关于 c#:Regex 用逗号分隔 – 不在括号或单引号内

Regex split by commas - not within parenthesis or single quotes

我有以下 SQL 语句,我试图将其拆分为列:

1
2
3
4
5
6
select
    count(rtnotes.keyno) as value,
    ent.company as label,
    'j-ChartDrillDown-406,'+CAST(ENT.ENTID AS CHAR(10)) AS link,
    dateadd(week, datediff(wk, 0, dateadd(wk,-5,getdate())), -1) as test
    ...

我希望在 select 语句中将其拆分为 4 列:

  • count(rtnotes.keyno) as value
  • ent.company as label
  • 'j-ChartDrillDown-406,'+CAST(ENT.ENTID AS CHAR(10)) AS link
  • dateadd(week, datediff(wk, 0, dateadd(wk,-5,getdate())), -1) as test
  • 我已经能够使用不在引号内的逗号分隔:

    1
    ,(?=(?:[^']*'[^']*')*[^']*$)

    但我也需要忽略括号内的逗号(在这种情况下由于 dateadd 和 datediff 是嵌套括号)

    https://regex101.com/r/UUNUF9/1/


    这是您需要的正则表达式。

    正则表达式:

    1
    [^select][^\\s].+[\\(\\)]?[^,|\\s]

    例如,对于您的数据,请点击链接。
    https://regex101.com/r/Zhk1JP/2


    (评论太长)

    除非您知道要解析的每个查询的嵌套括号的确切级别数,否则您不能。基本上是因为它变得与使用正则表达式解析 HTML 相同。

    原因是这种情况下的括号就像 HTML 的开始和结束标记。此外,您必须确保处理诸如 SELECT ':)' AS SmileyCAST(')' AS NCHAR(1)) 之类的情况,这些情况可以将括号括在字符串值中,这会给您带来很多麻烦。

    然而,有一些像 SQL Parser 这样的项目可以帮助你实现你想要的。