内容:
- 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] 这里是内容 }******************* 这里是内容*/