2010-03-05 47 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