正则表达式用逗号分隔 - 不在括号或单引号内

Posted

技术标签:

【中文标题】正则表达式用逗号分隔 - 不在括号或单引号内【英文标题】: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 列:

    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

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

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

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

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

【问题讨论】:

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

【讨论】:

以上是关于正则表达式用逗号分隔 - 不在括号或单引号内的主要内容,如果未能解决你的问题,请参考以下文章

优化逗号分隔值正则表达式

Java正则表达式用逗号分割字符串,但忽略引号和括号[重复]

python 正则表达式查找单引号内的所有单引号

C#正则表达式用分隔符分割行,但忽略引号内的分隔符

正则表达式删去双引号vscode

正则表达式拆分和忽略括号