使用正则表达式删除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
你可以试试这个:
(?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