【问题标题】:Using regular expressions to remove all the GOs in a sql script file使用正则表达式删除 sql 脚本文件中的所有 GO
【发布时间】:2012-03-14 03:30:46
【问题描述】:

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

问题是到目前为止我还没有找到合适的正则表达式。使用简单的 \bGO\b 忽略大小写会拆分它。但也会在评论中拆分所有 go(s),例如

--这个go也会被拆分

使用这个表达式 ^\bGO\b[^--]$ 几乎可以解决我的问题,但是当我有两个连续的 GO 时出现一些错误(无论出于何种原因,它们都在我的域后面)。

end
go 
GO 

这就是我的脚本中 SP 创建结束的样子。

我是用 C# 来做的

非常感谢

** 编辑 **

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

^\s*go\s*\r\n

【问题讨论】:

  • 需要更多信息,以便我们为此提供“全能”正则表达式模式。总的来说,我会为此设置一个“沙盒”单元测试;设置一个包含您想要或不想删除的 GO 模式的文字,然后将“候选”正则表达式算法应用于每个模式,并断言生成的文本是您想要的。给定您的特定正则表达式通过或失败的测试应该是有关如何修改正则表达式的线索。如果您向我们提供更多您希望或不希望删除的模式示例,这将有助于我们为您提供帮助。
  • @Andres 有点跑题了:^\bGO\b[^--]$ 真的有效吗,还是有错字?我想你可能想避免-- before GO,而不是之后。
  • @KeithS 很难举个例子,因为这将应用于创建 SP、函数和视图的所有数据库源。但基本上它是一个可以非常多样化的 SQL 文件源。例如,我在 /* ... */ 之间的注释代码以及行 cmets 内的 'go' 动词方面遇到了一些问题,例如 -- 这应该去 ...

标签: c# regex tsql


【解决方案1】:

你可以试试这个:

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

意思是,如果字符串 go 前面没有两个或多个破折号后跟任何内容,则将其匹配。

这应该可以解决问题!

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

已编辑以忽略“go”后跟字母/数字(最后一次尝试:))并添加了指向正则表达式工具的链接

PS:如果你还没有发现this 是关于 RE 的一个很好的资源。

PS2:This is a great tool 用于 RE 创作/测试

【讨论】:

  • 干杯阿德里亚诺,但正则表达式在这样的地方失败:GRANT ALL ON C_MAIL_CAT_CONV_TYPES TO IPSAdmins GRANT ALL ON C_MAIL_CATEGORIES TO IPSAdmins 我得到 GRANT ALL ON C_MAIL_CAT_CONV_TYPES TO IPSAdmins GRANT ALL ON C_MAIL_CATE
  • 我知道这个网站,我想,正如我们的朋友 Reginaldo 常说的,“帮自己一个忙,学习正则表达式”:-)
  • 几乎,但无法处理以下代码(它将nago.OPERATOR_CD的go解释为go:laa.PERIOD_CD为[AccPeriodType],nago.OPERATOR_CD为[Partner],OFFICE_FCD为[PartnerOffice ],
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    (^(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  
    

    【讨论】:

    • 直到今天我都没有。转到某个锚点
    【解决方案4】:

    如果没有正则表达式,处理最后一种情况可能会更容易。

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

    【讨论】:

      【解决方案5】:

      对我来说它有效:

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

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

      【讨论】:

        猜你喜欢
        • 2019-05-02
        • 2011-10-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-23
        • 2021-04-18
        相关资源
        最近更新 更多