c# 正则 replace 高级用法


需求: 替换网页上所有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/   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"
$&  替换整个匹配
$` 替换匹配前的字符
$' 替换匹配后的字符
$+ 替换最后匹配的组
$_  替换整个字符串

 




免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM