【问题标题】:Regex split by commas - not within parenthesis or single quotes正则表达式用逗号分隔 - 不在括号或单引号内
【发布时间】:2019-05-29 04:58:01
【问题描述】:

我尝试将以下 SQL 语句拆分为列:

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 列:

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

我已经能够使用逗号分隔,不在引号内:

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

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

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

【问题讨论】:

  • 老实说,即使有人(例如 Wiktor)可以提供一个应该可以工作的正则表达式,如果您长期需要这样做,您可能想硬着头皮写一个基本的 SQL 解析器.至少,这个解析器可以处理 SQL 查询的SELECT 部分。
  • 您使用的是哪个 dbms?
  • 看起来您已经将这些内容分成 4 列。你到底想在这里做什么?您能否提供示例源数据以及您的期望是什么?

标签: c# sql .net regex split


【解决方案1】:

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

正则表达式:

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

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

【讨论】:

  • [^select] 应该表示不是单词“select”吗?因为它没有。它匹配除 "s"、"e"、"l"、"c"、"t" 以外的任何单个字符。
  • 这将被视为 First Select,然后是一个空格。我已经给出了示例的链接以供参考。如果您在除第一行之外的任何其他内容的开始之前提供 Select,它也会在行尾接受 select。
【解决方案2】:

(评论太长)

除非您知道要解析的每个查询的嵌套括号的确切级别数,否则您不能。基本上是因为它变得和parsing HTML using Regular Expressions一样。

原因是这种情况下的括号就像 HTML 的开始和结束标记。此外,您必须确保处理SELECT ':)' AS SmileyCAST(')' AS NCHAR(1)) 之类的情况,这些情况可能会在字符串值中包含括号,这会让您非常头疼。

但是,有像 SQL Parser 这样的项目可能会帮助您实现您想要的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-14
    • 1970-01-01
    • 2014-10-06
    • 1970-01-01
    • 1970-01-01
    • 2020-04-27
    相关资源
    最近更新 更多