2012-07-27 56 views
0

我一直在研究應用程序中的一些遺留代碼,它使用Regex檢測SQL存儲過程的文本中的某些關鍵字,並且發現了一個我無法完成的錯誤由於我對正則表達式的瞭解有限,所以是正確的。正則表達式在存儲過程中檢測WITH選項

基本上,我目前在所有的作品,但一個情況下,正則表達式:

(?<=\n\s*)(?<!with.*[\s\S]*)as 

應該對這個版本的存儲過程的返回匹配:

ALTER PROCEDURE [dbo].[p_obj_name_with_something] 
    @username [nvarchar](100) = null, 
    @id [int] = null, 
    @mode [int] = 0 
AS 
/*------------------------------------------------------------------------- 

但是它不應該對於這個版本,但它目前確實返回一個匹配:

ALTER PROCEDURE [dbo].[p_obj_name_with_something] 
    @username [nvarchar](100) = null, 
    @id [int] = null, 
    @mode [int] = 0 
WITH EXECUTE AS CALLER 
AS 
/*------------------------------------------------------------------------- 

我想要一個匹配,當keywor d與不是之前發現的AS關鍵字,但它會允許存儲過程的名稱或參數內的單詞。

我認爲檢測的工作方式是,如果關鍵字WITH有空白(或換行符)的任何一邊,但我不能完全弄清楚正則表達式的語法。

有什麼建議嗎?

+1

變長lookbehind ??? – 2012-07-27 18:00:13

+0

這是哪種語言?似乎只適用於.NET! – Cylian 2012-07-27 18:01:09

+0

這用於內部C#winforms應用程序。我一直在使用Espresso來測試它。 – XN16 2012-07-27 18:02:30

回答

0

即使ŧ儘管這不是真正的答案,但我發現更簡單的方法是在我們的存儲過程中強制執行一些命名約定規則,並修改違反規則的20個左右。

確實,這是一個正則表達式不是解決方案的情況!

0

看看這個網站:
http://www.mikesdotnetting.com/Article/46/CSharp-Regular-Expressions-Cheat-Sheet

通知行:

\ s匹配任何空白,包括空格,製表,換頁等相當於「[\˚F\ n \ r \噸\ v]」。
[^ xyz]否定字符集。匹配任何不包含的字符。例如,「[^ abc]」匹配「plain」中的「p」。

所以.....
[\ S] + [[WITH] | [有] [\ S] + [^ AS] | [^如]] * 擊穿它:
+是兩側的空格
[[with] | [WITH] [不區分大小寫檢查與
[[AS] | [^ as]] *不區分大小寫的檢查將匹配只要AS或心不是有
希望這有助於

+1

什麼是混亂和錯誤的答案。我甚至不能倒下你... – 2012-07-27 18:19:50

+0

@Ωmega:我同意你的看法。 – Cylian 2012-07-27 18:49:47