日期:2014-05-17  浏览次数:20360 次

像我这种情况,怎么样让我的数据从外往内正则匹配呢?
内容:
HTML code

{$All[D:1,2,3:D]
    {$De[L:3,4,5:L]
    这里是内容
    }
}


我用正则:(?m)\{\$(?<Type>.*)\[(?<ParName>.*):(?<ParValue>.*):(.*)\](?<Content>.*[^\}\{]+)\}先匹配里边的
C# code
{$De[L:3,4,5:L]
    这里是内容
    }

然后用递归(里边用Regex.Replace()替换成只只剩下"这里是内容"),再匹配外面一层.即
C# code
{$All[D:1,2,3:D]
    这里是内容
}

最后再用递归函数替换成结果"这里是内容".
这里是"从里到外"的匹配.
如果我是想要"从外到里"的匹配.即,先匹配
C# code
{$All[D:1,2,3:D]
    {$De[L:3,4,5:L]
    这里是内容
    }
}

然后递归匹配替换后成为
C# code

{$De[L:3,4,5:L]
    这里是内容
    }


最后再递归替换后只剩下 "这里是内容"
递归我已经写好了.上面的正则实现了"从里到外"的匹配,现在就是不明白这个"从外到里"的正则如何写.
有人帮我修改一下正则让我达到我要的效用吗?谢谢!

------解决方案--------------------
C# code

        static Regex reg = new Regex(@"\{[^{}]+((?:(?<Open>\{)[^\]]*\]([^}]+))*(?:(?<-Open>\})[^{}]*)*)*(?(Open)(?!))\}");
        static void Main(string[] args)
        {
            string str = @"{$All[D:1,2,3:D]
    {$De[L:3,4,5:L]
    这里是内容
    }
}
";
            GetValue(str);
            Console.WriteLine(reg.Match(str).Groups[2].Value);
            Console.ReadKey();
        }
        public static void GetValue(string str)
        {
            MatchCollection mc = reg.Matches(str);
            foreach (Match m in mc)
            {
                Console.WriteLine(m.Value);
                Console.WriteLine("*******************");
                GetValue(m.Groups[1].Captures[0].Value);
            }
        }
/*
{$All[D:1,2,3:D]
    {$De[L:3,4,5:L]
    这里是内容
    }
}
*******************
{$De[L:3,4,5:L]
    这里是内容
    }
*******************

    这里是内容


*/