2009-10-13 90 views
1

所以我想弄清楚一個正則表達式,並有一些問題。我想查找(匹配)的是大型腳本文件中的所有SQL參數,但不匹配單引號中的項目(例如電子郵件地址)。例如:正則表達式不匹配報價中的項目

INSERT INTO [User] 
(
    [UserGuid], [CompanyGuid], [Name], [EmailAddress] 
) VALUES (
    @UserGuid1, @CompanyGuid, 'Jason', '[email protected]' 
) 

隨着@UserGuid1@CompanyGuid匹配,但不@jason匹配。我一直用這個正則表達式:

(@+[\w]+) 

但它的電子郵件地址相匹配,所以我試圖做一個負前瞻/背後是這樣的:

(?<!')[\W](@+[\w]+)[\W](?!') 

但它相匹配的「(」在下面的例子:

INSERT INTO [User] ([UserGuid]) VALUES (@UserGuid1) 

任何人都有一個想法是什麼,我在這裏失蹤的東西,可以說:「?什麼,是不是在報價集」此外,它是安全的假設均衡報價套。

回答

2

你有沒有嘗試以下方法?

(?<=\W)(@\w+) 

基本上它確保由非單詞字符之前捕獲的值,你可以添加前瞻太多,但它有點多餘的,因爲+是貪婪,將匹配到無字呢。

下面將確保在INSERT INTO [User] ([UserGuid]) VALUES ('@UserGuid1')沒有匹配:

(?<![\w'])(@\w+) 
+0

我不認爲這會起作用,因爲在第二個示例文本中的參數之前沒有空格。 –

+0

現在已修復(過度使用會導致用戶失望,jeff) – SilentGhost

+1

好的,這似乎工作,雖然它會匹配不是電子郵件地址但是是引用輸入的'@something'。添加引號或後面的引號會有所幫助,如下所示: (?<= \ W)(?<!')(@ \ w +)(?!') –

1

(@ + [^'] +)應該有所幫助。 [^',]將匹配除單引號,空格或逗號之外的任何內容。您可能需要添加更多字符,但這是一般想法。

1

嘗試這種情況:

(?<=[^\w'])(@\w+)(?!')

這指定每個匹配必須由非文字字符的前面(除對於單引號),然後有一個@符號和一個單詞,並沒有跟着另一個單引號。

+0

是的,這正是我的評論所說的 – SilentGhost

+1

我不打算進入互聯網的論點,但如果你測試它,你會發現我是對的。 我正在使用此測試器: http://www.gskinner.com/RegExr/ –

+0

我並不是說你錯了,我說的是,有效地在你的評論之前發佈了同樣的東西回答。此外,OP寫道*假設平衡報價集合是安全的,所以前瞻檢查又是多餘的。 – SilentGhost