• 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"

    $&
     替换整个匹配

    $`
    替换匹配前的字符

    $'
    替换匹配后的字符

    $+
    替换最后匹配的组

    $_
     替换整个字符串


      

  • 相关阅读:
    Exchange 2007 安装后的一些管理问题2
    几个不同领域的软件厂商。
    【新鲜提取的两款词典中英版DioDict、英英版DioDict牛津词典
    转:分布式 DBA:存储、I/O 和 DB2,第 1 部分(针对在网络存储环境中部署 DB2 数据库的建议)(1)
    脚本:列出windows上已安装的应用程序(使用中发现部分没有vender的应用程序列不出来)
    判断安卓程序是否高危程序。
    转:Target Daemon (tgtd) tgtadm
    转:探索 AIX 6:在 AIX 6 上配置 iSCSI Target
    windows live writer 与博客园
    转:项目管理。
  • 原文地址:https://www.cnblogs.com/zwbgreat/p/2748672.html
Copyright © 2020-2023  润新知