2012-02-23 100 views
4

我想解析一個包含像創建函數和存儲過程的命令的大型SQL腳本。每當我找到一個GO語句時(我想用普通的ado.net而不是SMO來執行它),我想在字符串中拆分文件。使用正則表達式刪除SQL腳本文件中的所有GO

問題是,到目前爲止我還沒有找到合適的正則表達式。使用一個簡單的忽略大小寫將會分裂它。同時也將拆分都去(S)在註釋裏像

- 這一點去也會被分割

使用這種表達^\bGO\b[^--]$幾乎解決我的問題,但我得到了一些錯誤,當我有兩個連續的GOS (無論出於何種原因,存在於我的域名後面)。

end 
go 
GO 

這是如何在我的腳本中創建SP的結尾。

我做它在C#

非常感謝

** 編輯 **

一位同事想出了一個解決方案,就目前來看,對全體我的劇本

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

+0

更多信息。一般來說,我會爲此設置一個「沙箱」單元測試;設置一個文字,其中包含您要做或不想刪除的GO模式,然後對這些模式應用「候選」正則表達式算法,並聲明所產生的文本是您想要的。考慮到你的特定正則表達式的測試通過或失敗應該是如何修改正則表達式的線索。如果您向我們提供了更多您希望移除或不希望移除的模式示例,它將幫助我們爲您提供幫助。 – KeithS 2012-02-23 17:34:42

+0

@Andres有點偏題:是否**'^ \ bGO \ b [^ - ] $'**真的有用,還是有拼寫錯誤?我想你可能想要避免' - '_before_ GO,而不是之後。 – GolfWolf 2012-02-23 17:41:39

+0

@KeithS很難舉一個例子,因爲這將被應用到所有創建SP,函數和視圖的數據庫源。但基本上它是一個可以非常多樣化的SQL文件源。我在註釋代碼/ * ... * /之間出現了一些問題,例如,以及在行註釋中的'go'動詞 - 這應該是... – Andres 2012-02-24 08:29:43

回答

3

你可以試試這個零件:

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

意義,馬赫串如果它不是由2個或更多破折號前面其次是任何事情。

這應該是訣竅!

編輯以強制只在單詞邊界檢查

編輯忽略「走出去」,隨後字母/數字(最後一次嘗試:)),並添加鏈接的正則表達式工具

PS:如果您還沒有找到this是關於RE的一個很好的資源。

PS2:This is a great tool爲RE創作/測試

+0

乾杯阿德里亞諾,但正則表達式在這樣的地方失敗: 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 – Andres 2012-02-24 08:25:26

+0

我知道這個網站,我想,我們的朋友雷吉納爾多使用地說, 「幫個忙,學習正則表達式」:-) – Andres 2012-02-24 08:31:52

+0

嘿!嘗試最後更新RE(希望工程) – Vagaus 2012-02-24 11:05:12

0

它命名爲c應該更容易處理這個最後的情況沒有正則表達式。

後您拆分腳本,刪除了其中String.IsNullOrWhitespace(part) == true

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 
+0

我既沒有到今天。GOTO someAnchor – 2017-10-31 14:53:26