使用正则表达式删除sql脚本文件中的所有GO

本文关键字:GO 文件 脚本 正则表达式 删除 sql | 更新日期: 2023-09-27 18:25:39

我正在尝试解析一种包含创建函数和存储过程等命令的大型SQL脚本。每当我找到GO语句时,我都想将文件拆分为字符串(我想使用普通的ado.net而不是SMO来执行它)。

问题是到目前为止,我还没有找到合适的正则表达式。使用一个简单的'bGO'b忽略大小写将拆分它。但也会拆分像这样的注释中的所有go

--这个go也将被拆分为

使用这个表达式^'bGO'b[^--]$几乎解决了我的问题,但当我有两个连续的GO时(无论出于什么原因,它们都在我的域后面),我会遇到一些错误。

end
go 
GO 

在我的脚本中,SP创建的结尾就是这样的。

我在C#中执行

非常感谢

**编辑**

一位同事提出了一个解决方案,目前适用于我的所有脚本

^'s*go's*'r'n

使用正则表达式删除sql脚本文件中的所有GO

你可以试试这个:

(?i-msnx:'b(?<!-{2,}.*)go[^a-zA-Z])

也就是说,如果字符串前面没有两个或多个短划线,后面跟着任何东西,就用mach将其改为。

这应该奏效!

编辑为仅在单词边界处强制检查

编辑为忽略后面跟着字母/数字的"go"(上次尝试:)),并添加了到正则表达式工具的链接

附言:如果你还没有发现这是一个伟大的资源关于RE.

PS2:这是RE创作/测试的一个很好的工具

你可能已经听说过"有些人在遇到问题时会想"我知道,我会使用正则表达式。"现在他们有两个问题。"如果性能不是你更关心的问题,你可以简单地检查修剪后的线是否等于"go",忽略这种情况。您不会浪费更多时间处理regex。

我知道这是一个非常古老的问题,但希望这能帮助其他人。

这是我使用的正则表达式:

(^(go)['s,;])|(^(go)$)|(;go)|(;)'s*(go)

我还没能打破它。

这是我使用的测试用例:

use SCRATCH  
GO;  
--go  
set nocount ON ;go;  
go  
' go '   
'go'  
'go  
go'  
create table gonogo ( go int null, nogo int null)   
GO  
insert INTO mungbean VALUES (1); go  
GO  
;  
select * from mungbean  
go  
 go  
 go;  
 '  
go  

如果没有regex,处理最后一种情况可能会更容易。

拆分脚本后,删除String.IsNullOrWhitespace(part) == true

对我来说,它起了作用:

(?<!.)(['s]*)(go|GO)'s*(['r'n])?

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