2013-12-24 74 views
1

在C#中,我試圖驗證字符串,看起來像:等號的正則表達式問題?

[email protected]='test'

[email protected]=2827

這裏是我的代碼:

string t1 = "[email protected]='test'"; 

string r = @"^([Ii]|[Oo])@\w=\w"; 

var re = new Regex(r); 

如果我走「= \ w」關閉結束或變量r我變爲True。如果我在\ w後面添加一個「= \ w」,它就是False。我希望@和=之間的字符能夠是任何字母數字值。 =號後的任何內容都可以包含字母數字和'(單引號)。我在這裏做錯了什麼。我很少使用正則表達式,通常可以找到示例,這是自定義格式,但即使有我遇到的問題。

+0

東西'''不是一個「單詞字符」,因此它不會匹配'\ w'。比較使用''I @ parameter = test''作爲輸入時的結果。 – user2864740

+0

也許這樣(未經測試):'([IiOo])@ \ w + = [\ w'] +' – Blorgbeard

回答

4
^([Ii]|[Oo])@\w+=(?<q>'?)[\w\d]+\k<q>$ 

正則表達式:

^    start of line 
([Ii]|[Oo]) either (I or i) or (O or o) 
\w+   1 or more word characters 
    =   equals sign 
    (?<q>'?)  capture 0 or 1 quotes in named group q 
    [\w\d]+  1 or more word or digit characters 
    \k<q>  repeat of what was captured in named group q 
$    end of line 
+0

剛剛意識到對於以O開頭的字符串,我不需要等號或值。有沒有辦法讓這個「可選」? –

2

使用\w+而不是\w設置爲一個字符或更多。或\w*獲得零個或多個:

試試這個:Live demo

^([Ii]|[Oo])@\w+=\'*\w+\'* 
1

如果您正在多一點嚴格使用paramname

^([Ii]|[Oo])@paramname=[']?[\w]+[']? 

Here is a demo

+0

paramname不能被硬編碼我只是以此爲例。它實際上用於通用函數來調用存儲過程,並且這將是存儲過程參數的名稱。 –

+0

I/O(輸入/輸出),然後是等號後的值。 –

+0

所以,現在你讓我想到了......我無法將一個值傳遞給OUT存儲過程參數。我將不得不對其進行修改,否則在等號後忽略任何內容。感謝讓我的頭腦開始移動:) –

1

你可以嘗試這樣的事:

Regex rx = new Regex(@"^([IO])@(\w+)=(.*)$" , RegexOptions.IgnoreCase) ; 
  • 比賽第1組會給你我或澳值
  • 賽第2組會給你(參數方向?)參數的名稱
  • 匹配組3將給出參數的值

你可能是對第3組嚴格,與之相匹配的爲

(([^']+)|('(('')|([^']+))*')) 

第一個選擇匹配1個或多個非引號字符;第二個選擇帶引號的字符串相匹配的文字與任何內部(嵌入式)被他們加倍報價逃生,所以它會匹配像

  • ''(空字符串
  • 'foo bar'
  • 'That''s All, Folks!'