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

6
我可以帮您将电子表格中的数据转换为SQL插入语句。我已经研究了在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)

最终,最后匹配将结果插入到用于插入语句的 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。如果我删除第八个括号项,即将我的第九个项目变为第八个,则会返回我想要的20120101。

所以我的问题是,当使用查找 / 替换和正则表达式时,SSMS / SQL是否允许使用9个带标签的表达式?还是我漏掉了什么?我知道有其他方法可以做到这一点。我只是想在将其移入sproc或应用程序之前快速完成POC。

感谢任何帮助。 -Peter


您可以直接从电子表格中导入数据。这些数据已经分列了吗? - D'Arcy Rittich
为什么需要使用replace函数?如果数据来自电子表格并且您正在使用SSMS,为什么不使用导入/导出管理器?此外,为什么要重新格式化数据?电子表格不支持mm/dd/yyyy日期格式吗?您不能编写一些单元格公式来连接插入数据的字符串吗? - Trisped
请编辑您的问题以添加代码表达式的正确格式。您可以通过以下方式完成:用反引号(“`”)括起来,选择所有内容并单击工具栏按钮“{}”,或标记一块代码并按Ctrl + K。在输入时,您可以立即在“提交问题”按钮下方预览您的帖子;预览实时更新,因此它是所见即所得的视图。适当的格式使您的问题更易于阅读和理解,因此更有可能获得答案。谢谢。 :) - Ken White
谢谢大家,但这些都是我必须处理的限制。数据以我所述的格式输入。在插入语句中添加了其他数据,这些数据并不来自此表格,因此直接导入将无法使用。我不是在寻找替代方法。我需要让它工作。谢谢。 - Peter Anderson
@Peter Anderson 不要忘记接受答案并让我们知道你的决定。此外,如果您知道查找/替换表达式为什么不起作用,那么这也很好。 - Trisped
@Trisped:当有人回答问题时,我会接受答案。每个人都在给我提供替代我的过程的方法,而不是回答关于在SQL中使用查找和替换系统以及最显著的第9个括号项的正则表达式问题。 - Peter Anderson
1个回答

2

您提供的记录与我的MS SQL Server Management Studio 2008r2不匹配。

从您的描述中,似乎存在“标记表达式9”的问题,因为使用“标记表达式8”时返回了预期的结果,但使用“标记表达式9”时没有。 您可以向Microsoft询问或报告错误

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

如果您需要示例,请告诉我。

更新:我在MS SQL Server Management Studio 2008r2,Visual Studio 2005和Visual Studio 2010中尝试了您的示例,得到与您相同的结果,\ 9返回一个空字符串。 经过查看,我发现其他人也遇到了这个问题(请参见Henrique Evaristo的社区内容),整个系统已在新编辑器中被替换

因此,回答您的问题,由于错误,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

感谢您的回复。我认为它们不能为您工作的原因是它们被粘贴到SO中的方式存在问题。我已经更新了原始文本,以反映从SQL到SO粘贴时每个项目之间的“单数空格”,这些项目在粘贴时变成了多个。 - Peter Anderson
@Peter Anderson更新了结果。我会建议你切换到Excel或者自己编写代码来解决问题,但是我已经提供了一个解决方案以备不时之需。你可能需要在'\0'前加上特殊字符,因为你将无法通过行进行搜索。或者,你可以更改第二个查询,在选择中查找'\0'并从那里开始工作。 - Trisped
谢谢你对此的回答。这正是我所需要的。还要感谢你在最后提供的额外选项。我已经将这个东西分成了三部分来处理各种替换,我没有想到可以只使用\0并在第四次替换时取最后一部分。再次感谢。 - Peter Anderson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接