c# 正则 replace 高级用法

不打扰是莪最后的温柔 提交于 2020-03-02 07:11:31

 


需求: 替换网页上所有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"

$&
 替换整个匹配

$`
替换匹配前的字符

$'
替换匹配后的字符

$+
替换最后匹配的组

$_
 替换整个字符串


  

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!