正则表达式用逗号分隔 - 不在括号或单引号内
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 Smiley
或CAST(')' AS NCHAR(1))
之类的情况,这些情况可能会在字符串值中包含括号,这会让您非常头疼。
但是,有像 SQL Parser 这样的项目可能会帮助您实现您想要的。
【讨论】:
以上是关于正则表达式用逗号分隔 - 不在括号或单引号内的主要内容,如果未能解决你的问题,请参考以下文章