SQL查找并替换正则表达式捕获组限制?

时间:2012-03-29 17:32:07

标签: sql regex sql-server-2008 replace capturing-group

我需要将电子表格中的数据转换为SQL中的insert语句。我已经解决了大多数正则表达式在SSMS中使用查找和替换工具,但是在尝试引用我的最终替换中的第9个带括号的项时,我遇到了一个问题。

这是原始记录:

Blue Doe 12/21/1967 1126 Queens Highway Torrance CA 90802 N 1/1/2012

这就是我所需要的(现在):

select 'Blue','Doe','19671221','1126 Queens Highway','Torrance','CA','90802','N','20120101'

由于允许括号项目数量的限制,我必须经历三次替换。如果我可以先将其作为POC进行操作,这可能会影响存储过程。

这是第一个匹配的表达式:

^{:w:b:w:b}{:z}/{:z}/{:z:b[0-9A-Za-z:b]+:b:w:b[A-Z]+:b:z:b:w:b}{:z}/{:z}/{:z}

替换:\10\2/0\3/\40\5/0\6/\7

这会在月份和日期中添加零,以便它们至少包含两个字符。

下一个匹配项将日期重新格式化为查询所需的格式(没有关于不使用日期字段的注释。这是数据库的客户端要求。)

匹配表达式:

^{:w:b:w:b}[0-9]*{[0-9]^2}/[0-9]*{[0-9]^2}/{:z}{:b[0-9A-Za-z:b]+:b:w:b[A-Z]+:b:z:b:w:b}[0-9]*{[0-9]^2}/[0-9]*{[0-9]^2}/{:z}

替换:\1\4\(2,2)\(2,3)\5\8\(2,6)\(2,7)

最后,最后的匹配将结果插入将在insert语句中使用的SQL语句。

匹配表达式:

^{:w}:b{:w}:b{:z}:b{[0-9A-Za-z:b]+}:b{:w}:b{[A-Z]+}:b{:z}:b{:w}:b{:z}

替换:select '\1','\2','\3','\4','\5','\6','\7','\8','\9'

除最后一次更换外,一切正常。出于某种原因,\ 9不会从匹配中获取数据。如果我只用\ 9替换整个替换表达式,我会得到一个空格。如果我使用\ 8,我得到N.如果我消除第8个带括号的项目,从而使我的第9个项目成为第8个,它将返回我想要的内容,20120101。

所以我的问题是,当使用find / replace和正则表达式时,SSMS / SQL是否允许9个带标记的表达式?或者我在这里遗漏了什么?我知道还有其他方法可以做到这一点。我只是想把它作为POC快速完成,然后我们将它移到一个sproc或应用程序中。

感谢您的帮助。 -Peter

1 个答案:

答案 0 :(得分:2)

您的匹配表达式都不适用于您在MS SQL Server Management Studio 2008r2中提供的记录。

根据您的描述,听起来标记表达式9存在问题,因为使用标记表达式8时会返回所需的结果,而不是9.您可能需要ask Microsoft or report it as a bug

更快的解决方案是将正在执行SSMS中的查找/替换的文本移动到电子表格,并使用单元格公式将数据解析为插入命令。如果你有MS Excel,那么CONCATENATE,FIND和MID函数可能会很有用。此外,它有助于将值拆分为自己的列,以便您可以格式化日期,然后使用一个连接来构建插入。

如果您需要一个例子,请告诉我。

更新:我在MS SQL Server Management Studio 2008r2,Visual Studio 2005和Visual Studio 2010中尝试了您的示例,结果与您获得的结果相同,\ 9返回一个空字符串。检查我发现others are also having this issue(参见Henrique Evaristo的社区内容)并且整个系统已经replaced in the new editors

因此,在回答您的问题时,由于错误,SSMS不支持9个带标记的表达式。

如果您无法使用电子表格的想法,您可以尝试将操作分为两部分,设置前8个值,然后再次向后摆动以执行最后一个操作。例如:

^{:w}:b{:w}:b{:z}:b{[0-9A-Za-z:b]+}:b{:w}:b{[A-Z]+}:b{:z}:b{:w}:b:z
select '\1','\2','\3','\4','\5','\6','\7','\8','\0'

:w:b:w:b:z:b[0-9A-Za-z:b]+:b:w:b[A-Z]+:b:z:b:w:b{:z}
\1