我正在尝试解析一个包含创建函数和存储过程等命令的大型SQL脚本。我想在每次找到GO语句时将文件拆分为字符串(我想使用普通的ado.net而不是SMO来执行它)。
问题是到目前为止我还没有找到合适的正则表达式。使用简单的 \bGO\b
忽略大小写会将其拆分。但是也会将评论中的所有内容分开,如
- 这个也将被拆分
使用这个表达式 ^\bGO\b[^--]$
几乎可以解决我的问题,但是当我连续两次执行GO时会出现一些错误(无论出于何种原因,我的域名都在后面)。
end
go
GO
这就是我的脚本中SP创建结束的样子。
我在C#
中这样做非常感谢
** 编辑 **
一位同事想出了一个解决方案,暂时适用于我的所有脚本
^\s*go\s*\r\n
答案 0 :(得分:3)
你可以试试这个:
(?i-msnx:\b(?<!-{2,}.*)go[^a-zA-Z])
意思是,如果前面没有两个或更多的破折号,后面跟着任何东西,请输入字符串去。
这应该可以解决问题!
已修改为仅强制检查字边界
编辑忽略'go'后跟字母/数字(最后一次尝试:))并添加了正则表达式工具的链接
PS:如果你没有找到this是关于RE的好资源。
PS2:This is a great tool用于RE创作/测试
答案 1 :(得分:3)
嗯,你可能已经听说过“有些人在面对问题时会想”我知道,我会使用正则表达式。“现在他们有两个问题。” 如果性能不是您最关心的问题,您可以简单地检查修剪线是否等于“go”,忽略大小写。你不会浪费更多时间处理正则表达式。
答案 2 :(得分:1)
我知道这是一个非常古老的问题,但希望这有助于其他人。
这是我使用的正则表达式:
(^(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
答案 3 :(得分:0)
在没有正则表达式的情况下处理这最后一种情况可能更容易。
分割脚本后,删除String.IsNullOrWhitespace(part) == true