• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

c#正则replace高级用法

原作者: [db:作者] 来自: [db:来源] 收藏 邀请


需求: 替换网页上所有a标签中的链接. 如:<a href="http://www.asiafinance.cn" target="_blank">亚洲财经</a>, 替换成<a href="http://www.baidu.com/?to=http://www.asiafinance.cn" target="_blank">亚洲财经</a>

刚开始的做法是用Regex.Matches方法找出a标签中所有的链接,然后循环Regex.Replace替换, 因为是整个页面的全局替换,
所以,第一个链接替换了,第二个又来一遍,直到最后一个结束.http://tactic.asiafinance.cn/list/list_czzn.shtml,替换第一个的时候,把第二个那个链接也替换,后来就乱了.

这里解决方法还是Regex.Replace , 我把2个方法的代码都贴出来.

第一种 

        string content = "网站内容";
string pattern = @"<a[\s\S]*?href=(""(?<href>[^""]*)""|’(?<href>[^’]*)’|(?<href>[^>\s]*))[^>]*?>";
        MatchCollection mc = Regex.Matches(content,pattern,RegexOptions.IgnoreCase|RegexOptions.Compiled);
        foreach (Match m in mc)
        {
            string url = m.Groups["href"].Value;
            string replaceUrl = "http://www.baidu.com/" + "?to=" + url;
            content = Regex.Replace(content,url,replaceUrl);
        }

 

第二种

string content = "网站内容";
        string pattern = @"<a[\s\S]*?href=(""(?<href>[^""]*)""|’(?<href>[^’]*)’|(?<href>[^>\s]*))[^>]*?>";
        string repStr = "<a target=\"_blank\" href=\"http://www.baidu.com/?to=${href}\">";
        content = Regex.Replace(content,pattern,repStr,RegexOptions.IgnoreCase|RegexOptions.Compiled);

参考内容:
替换

  Regex类有一个静态的Replace方法,其实例也有一个Replace方法,这个方法很强大,因为它可以传入一个delegate,这样,你可以自定义每次捕获匹配时,如何处理捕获的内容。

public static void Main() 
{ 
string s = "1 12 3 5"; 

s = Regex.Replace(s,@"\d+",new 
MatchEvaluator(CorrectString),RegexOptions.Compiled|RegexOptions.IgnoreCase); 

Console.WriteLine(s); 
Console.ReadLine(); 
} 
private static 
string CorrectString(Match match) 
{ 
string matchValue = match.Value; 

if(matchValue.Length == 1) 
matchValue = "0" + matchValue; 
return 
matchValue; 
}

 


$number
 把匹配的第number组替换成替换表达式,还有这句话怎么写也表达不清楚意思,还是来个例子吧:

public static void Main() 
{ 
string s = "1 12 3 5"; 
s = 
Regex.Replace(s,@"(\d+)(?#这个是注释)","0$1",RegexOptions.Compiled|RegexOptions.IgnoreCase); 

Console.WriteLine(s); 
Console.ReadLine(); 
}

    这段代码返回的是 “01 012 03 05”
  就是说,对组一的每个匹配结果都用"0$1"这个表达式来替换,"0$1"中"$1"由组1匹配的结果代入

${name}
  把匹配的组名为"name"的组替换成表达式,

  上例的Regex
expression改成@"(?<name>\d+)(?#这个是注释)"后面的替换式改为"0${name}"结果是一样的

$$
  做$的转义符,如上例表达式改成@"(?<name>\d+)(?#这个是注释)"和"$$${name}",则结果为"$1 $12 $3
$5"

$&
 替换整个匹配

$`
替换匹配前的字符

$'
替换匹配后的字符

$+
替换最后匹配的组

$_
 替换整个字符串


  


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#串口通讯发布时间:2022-07-14
下一篇:
C#进程间共享内存通信方式发布时间:2022-07-14
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap