2010-03-05 17 views
0

比方說一個有一個字符串,如這一個:如何編寫搜索動態數量對的正則表達式?

string txt = "Lore ipsum {{abc|prop1=\"asd\";prop2=\"bcd\";}} asd lore ipsum"; 

像( 「PROP1」, 「ASD」),( 「prop3」, 「BCD」 我想提取 「ABC」 的信息和對)每對使用a;作爲分隔符。

EDIT1:(基於MikeB的)代碼

啊,越來越接近。我發現瞭如何解析如下:

string txt = "Lore ipsum {{abc|prop1=\"asd\";prop2=\"http:///www.foo.com?foo=asd\";prop3=\"asd\";prop4=\"asd\";prop5=\"asd\";prop6=\"asd\";}} asd"; 
    Regex r = new Regex("{{(?<single>([a-z0-9]*))\\|((?<pair>([a-z0-9]*=\"[a-z0-9.:/?=]*\";))*)}}", RegexOptions.Singleline | RegexOptions.IgnoreCase); 
    Match m = r.Match(txt); 
    if (m.Success) 
    { 
     Console.WriteLine(m.Groups["single"].Value); 
     foreach (Capture cap in m.Groups["pair"].Captures) 
     { 
      Console.WriteLine(cap.Value); 
     } 
    } 

問題1:我該怎麼調整正則表達式說「?每個由\分隔的」一對價值只有我說像字符」, ';'等等,但我不認爲我想允許任何字符的周圍的其他方法將會更加美好

問題2:?我該怎麼調整這個表達式工作,在這裏這件事

string txt = "Lore ipsum {{abc|prop1=\"asd\";prop2=\"http:///www.foo.com?foo=asd\";prop3=\"asd\";prop4=\"asd\";prop5=\"asd\";prop6=\"asd\";}} asd lore ipsum {{aabc|prop1=\"asd\";prop2=\"http:///www.foo.com?foo=asd\";prop3=\"asd\";prop4=\"asd\";prop5=\"asd\";prop6=\"asd\";}}"; 

所以我可能會嘗試讓一組{{...}},並使用正則表達式等?

+0

我更新了我的答案。我認爲現在有道理! – MikeB 2010-03-05 21:40:12

+0

確實是垃圾!該正則表達式將匹配任何包含七個字母的字符串 - 所有內容都是可選的。我將它應用於「匹配」一詞,並打印出最後五個字母,每行一個。幸運的是,@ MikeB的(編輯過的)答案更有意義。 – 2010-03-05 22:12:01

回答

2

我讓你是如何篩選的一些假設,但我認爲這個想法是非常那裏,每一對都被放入配對組的捕獲集合中,並且您可以有任意數量的配對組合

 string txt = "Lore ipsum {{abc|prop1=\"asd\";prop2=\"bcd\";prop3=\"bbb\";}} asd lore ipsum";    
     Regex r = new Regex("{{(?<single>([a-z0-9]*))\\|((?<pair>((?<key>([a-z0-9]*))=\"(?<value>([a-z0-9]*))\";))*)}}", RegexOptions.Singleline | RegexOptions.IgnoreCase); 
     Match m = r.Match(txt);    
     if (m.Success) 
     { 
      Console.WriteLine(m.Groups["single"].Value); 
      foreach (Capture cap in m.Groups["pair"].Captures) 
      { 
       Console.WriteLine(cap.Value);      
      } 
      foreach (Capture cap in m.Groups["key"].Captures) 
      { 
       Console.WriteLine(cap.Value); 
      } 
      foreach (Capture cap in m.Groups["value"].Captures) 
      { 
       Console.WriteLine(cap.Value); 
      } 
     } 
+0

儘管如此,鍵/值分割還有待完成。 – 2010-03-08 14:19:32

+0

我更新了它,將其拆分爲鍵和值。 – MikeB 2010-03-08 15:20:15