2015-07-01 66 views
0

我試圖自己創建正則表達式,但我無法做到。所以我希望得到一些幫助。我得到一個字符串是這樣的:正則表達式 - 值後=直到;

test=foo;test1=bar;test2=;test3= .some.other.stuff 

後,我的正則表達式findind值的 「=」

(?<[email protected]=).+?(?=;) 

它只有

  1. @測試工作=
  2. TEST1 = (並且僅當它在=後具有值時)

有人可以幫我嗎?我總是需要「=」後面的值,如果沒有值,我需要一個「空白匹配」。

更麻煩的是字符串的末尾,因爲它沒有「;」了。

回答

3

除非表現爲解析代碼巨大的關注 - Split會產生更可讀的代碼:

var pairs = text 
    .Split(';') 
    .Select(v => v.Split('=')) 
    .Select(pair=> new KeyValuePair<string, string>(pair[0], pair.Length==2? pair[1]:"")); 

正則表達式版本可能如下所示:

Regex.Matches("test=foo;test1=bar;test2=;test3= .some.other.stuff", 
    "([^=]+)=([^;]*)(?:;*)"); 

主要部分 - 指定最後的;字符爲「可選非捕獲組」 - (?:;*)

+0

我有它作爲第一拆分操作,但我希望它儘可能高性能。通常我會使用字符串操作(如split,replace,substring和remove)來完成所有任務,但是爲了這個任務,我想使用正則表達式,因爲我經常在很短的時間內收到這個字符串(使用不同的值),我需要儘快處理它們儘可能。 – Shamshiel

+0

@Shamshiel從性能的角度來看'IndexOf' /'Substring'可能會更好 - 特定情況下正確的手寫狀態機將擊敗由Regex生成的同一個狀態機。因爲任何表演練習都會假設你要麼嚴格地進行娛樂/教育,要麼真正測量了代碼,並發現這個特定片段是主要瓶頸。 –

+0

感謝您的詳細解答。我一直認爲RegEx比字符串操作更快。 – Shamshiel

0

如果你只是做這樣的事情(在這裏沒有LINQ):

string yourString = @"test=foo;test1=bar;test2=;test3=someotherstuff"; 
string[] temp = yourString.Split(';'); 

Dictionary<string, string> values = new Dictionary<string, string>(); 
for(int i = 0; i < temp.Length; i += 2) 
{ 
    var temp2 = temp[i].Split('='); 
    values.Add(temp2[0], temp2[1]); 
} 
1

得到公正的價值觀:

[^;]+=(?<val>[^;]*) 

將輸出

val: foo 
val: bar 
val: 
val: .some.other.stuff 

(是的,但仍然是空單的匹配,但字符串是"")。您可以在模式中用+而不是*消除該匹配。

一個更完整的方法,讓你鍵和值是

(?<key>[^;])+=(?<val>[^;]*) 

其輸出

key: t 
val: foo 
key: 1 
val: bar 
key: 2 
val: 
key: 3 
val: .some.other.stuff