如何编写搜索动态数量的对的正则表达式?

时间:2010-03-05 20:27:11

标签: c# regex parsing

假设有一个像这样的字符串:

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

我要提取的信息“abc”和对象(“prop1”,“asd”),(“prop3”,“bcd”),每对使用一个;作为界限。

编辑1 :(基于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\";}}";

因此,我可能会尝试获取{{...}}组并使用其他正则表达式?

1 个答案:

答案 0 :(得分: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);
            }
        }