【问题标题】:How to write regex that searches for a dynamic amount of pairs?如何编写搜索动态数量对的正则表达式?
【发布时间】:2010-03-05 20:27:10
【问题描述】:

让我们说一个有这样一个字符串:

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

我要提取的信息是 "abc" 和 ("prop1","asd") , ("prop3", "bcd") 之类的对,其中每对都使用 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\";}}";

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

【问题讨论】:

  • 我更新了我的答案。我觉得现在说得通了!
  • 确实是废话!该正则表达式将匹配任何包含七个字母的字符串——一切都是可选的。我将它应用于“匹配”这个词,它打印了最后五个字母,每行一个。幸运的是,@MikeB 的(已编辑)答案更有意义。

标签: c# regex parsing


【解决方案1】:

我对您的过滤方式做了一些假设,但我认为这个想法几乎就在那里。每对都放入对组的捕获集合中,您可以拥有任意数量的对。

        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);
            }
        }

【讨论】:

    猜你喜欢
    • 2019-06-23
    • 1970-01-01
    • 1970-01-01
    • 2014-09-15
    • 1970-01-01
    • 1970-01-01
    • 2017-04-07
    • 2014-11-26
    • 1970-01-01
    相关资源
    最近更新 更多