首页 新闻 赞助 找找看

求一正则表达式实现以下功能

0
悬赏园豆:10 [已解决问题] 解决于 2013-03-22 22:10

匹配替换表达式内容:{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博客园程序员的网上家园}整体的值

像这样 重内往外的替换方式用正则如何递归实现  或者用其它方式实现

BoyLife的主页 BoyLife | 初学一级 | 园豆:18
提问于:2013-01-21 17:58
< >
分享
最佳答案
0

你好,按照你的意思,后一步的输入是前一步的输出。但是你写的需求一点都不明确,也不明白到底是要得到什么结果。我先写了个大概的函数:

 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就是要替换的内容。希望楼主把需求写清楚! :)

收获园豆:10
月窟仙人 | 菜鸟二级 |园豆:383 | 2013-01-21 22:53

感谢您的回复!我将需求重新整理了一下。

BoyLife | 园豆:18 (初学一级) | 2013-01-22 09:47

@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 :)

月窟仙人 | 园豆:383 (菜鸟二级) | 2013-01-23 23:40
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册