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