匹配替换表达式内容:{MD532:{URL:{TK:001}}}
需求步骤:
1.先替换{TK:001}为http://www.cnblogs.com
替换后的表达式为{MD532:{URL:http://www.cnblogs.com}}
2再对{URL:http://www.cnblogs.com}中的网址进行URL编码替换
替换后的表达式为{MD532:http%3a%2f%2fwww.cnblogs.com}
3.再对{MD532:http%3a%2f%2fwww.cnblogs.com}中的http%3a%2f%2fwww.cnblogs.com进行MD5加密处理
最后结果应为http%3a%2f%2fwww.cnblogs.com加密后的值这里就不写出来了
上面表达式的格式是不确定的可能是其他情况例如:
{MD532:{URL:http://www.cnblogs.com}{TK:001}}
说明:
1.先要将{URL:http://www.cnblogs.com}中的网址进行URL编码并将他替换为编码后的值
2.再将{TK:001}整体替换为一个字符串
步骤1和步骤2替换后得到的表达式为
{MD532:http%3a%2f%2fwww.cnblogs.com博客园程序员的网上家园}
最后在对 http%3a%2f%2fwww.cnblogs.com博客园程序员的网上家园 进行MD5加密处理并替换{MD532:http%3a%2f%2fwww.cnblogs.com博客园程序员的网上家园}整体的值
像这样 重内往外的替换方式用正则如何递归实现 或者用其它方式实现
你好,按照你的意思,后一步的输入是前一步的输出。但是你写的需求一点都不明确,也不明白到底是要得到什么结果。我先写了个大概的函数:
1 using System; 2 using System.Linq; 3 4 class TextReplace 5 { 6 public static void Main() 7 { 8 TextReplace tr = new TextReplace(); 9 var result = tr.Replace("{MD532:{URL:{MD532:{TK:001}}}}","fff"); 10 Console.WriteLine(result); 11 } 12 13 public string Replace(string input,string rep) 14 { 15 var BraceStartIdx = input.LastIndexOf("{"); 16 var BraceEndIdx = input.IndexOf("}"); 17 if(BraceStartIdx < 0) return input; 18 var nextInput = String.Concat(input.Substring(0,BraceStartIdx),rep,input.Substring(BraceEndIdx+1)); 19 return Replace(nextInput,rep); 20 } 21 }
简单的尾递归而已,其中rep就是要替换的内容。希望楼主把需求写清楚! :)
感谢您的回复!我将需求重新整理了一下。
@BoyLife: Hi!需求还是比较乱。我再写下正则的解决办法:
1 var text = "{MD532:{URL:{TK:001}}}"; 2 var pattern = @"\{TK:001\}"; 3 var regex = new Regex(pattern); 4 var textWithUrl = regex.Replace(text,@"http://www.cnblogs.com"); 5 var urlPattern = @"\{URL:([\w\.\/=:]+)\}"; 6 regex = new Regex(urlPattern); 7 var match = regex.Match(textWithUrl); 8 var url = match.Groups[1].Value; 9 regex = new Regex(urlPattern); 10 var urlEncoded = regex.Replace(textWithUrl,HttpUtility.UrlEncode(url)); 11 var md5Pattern = @"\{MD532:([\S]*)\}"; 12 regex = new Regex(md5Pattern); 13 match = regex.Match(urlEncoded); 14 var stringToMD5 = match.Groups[1].Value; 15 Console.WriteLine(stringToMD5);
//结果 http%3a%2f%2fwww.cnblogs.com
这样就可以拿到这个字符串进行加密了。不知道是否符合你的需求。上面的代码可以再精简一点。may it helps :)