当前位置: 代码迷 >> ASP.NET >> 像小弟我这种情况,如何样让小弟我的数据从外往内正则匹配呢
  详细解决方案

像小弟我这种情况,如何样让小弟我的数据从外往内正则匹配呢

热度:8510   发布时间:2013-02-25 00:00:00.0
像我这种情况,怎么样让我的数据从外往内正则匹配呢?
内容:
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]    这里是内容    }*******************    这里是内容*/
  相关解决方案