• c#正则表达式分组取值


    就速度而言,当然是正则表达式最快,最高效了,下面谈谈如何用正则表达式分组来实现采集

    先分析下正则取值相比非正则取值来说,他的优势在哪

    这次的例子稍微弄复杂点

      <tr>
        <td class="odd"><a href="https://files.cnblogs.com/article/info/96/96231.htm">地皇传说</a></td>
        <td class="even"><a href="https://files.cnblogs.com/article/html/96/96231/index.shtml" target="_blank">孤心情劫 第一百零四章 孤心之心</a></td>
        <td class="odd">孤独漂流</td>
        <td class="even">449K</td>
        <td class="odd" align="center">07-09-16</td>
        <td class="even" align="center">连载</td>
      </tr>
      <tr>
        <td class="odd"><a href="https://files.cnblogs.com/article/info/95/95119.htm">符箓惊神</a></td>
        <td class="even"><a href="https://files.cnblogs.com/article/html/95/95119/index.shtml" target="_blank">第一卷 第一百章 多重幻境</a></td>
        <td class="odd">不锈</td>
        <td class="even">463K</td>
        <td class="odd" align="center">07-09-16</td>
        <td class="even" align="center">连载</td>
      </tr>

    如果按先前写的非正则表达式函数来取值的话,很明显就会出错,假如我想把里面的"孤独漂流"取出来,那一定是这

    样GetKeyValue(HtmlCode,"<td class=/"odd/">","</td>",1) ,函数里"1"这个值就大错特错了,因为上面也有个类似

    的,取1的话就会把"<a href="https://files.cnblogs.com/article/html/96/96231/index.shtml" target="_blank">孤心情劫 第一百零四章

    孤心之心</a>"取出来,如果函数是GetKeyValue(HtmlCode,"<td class=/"odd/">","</td>",2),参数值是2的话才能取

    得到自己想要的,也就是说,还要在函数内部加判断才行,但如果下次再遇到另外的矛盾呢?函数又要重写了,这样就

    太麻烦了.

    如果用正则表达式分组来取值的话,就不会出现上面所说的问题,函数可以一直用一个,需要改的只是正则表达式.

    正则表达式函数如下

            /// <summary>
            /// 正则表达式取值
            /// </summary>
            /// <param name="HtmlCode">源码</param>
            /// <param name="RegexString">正则表达式</param>
            /// <param name="GroupKey">正则表达式分组关键字</param>
            /// <param name="RightToLeft">是否从右到左</param>
            /// <returns></returns>
            public string[] GetRegValue(string HtmlCode , string RegexString,string GroupKey,bool RightToLeft)
            {
                MatchCollection m;
                Regex r;
                if (RightToLeft == true)
                {
                    r = new Regex(RegexString, RegexOptions.IgnoreCase | RegexOptions.Singleline | RegexOptions.RightToLeft);
                }
                else
                {
                    r = new Regex(RegexString, RegexOptions.IgnoreCase | RegexOptions.Singleline);
                }
                m= r.Matches(HtmlCode);
                string[] MatchValue = new string[m.Count];
                for (int i = 0; i < m.Count; i++)
                {
                    MatchValue[i] = m[i].Groups[GroupKey].Value;
                }
                return MatchValue;
            }


    现在,要想取"孤独漂流",只需改正则表达式了

    string RegexString = "<td class=/"odd/">(?<Title>[^<].*?)</td>";

    string[] title = GetRegValue(HtmlCode, RegexString, "Title", true);

    title[0]的值就是"孤独漂流",title[1]的值是"不锈"

    最后再举个例子,假如我想取"<a href="https://files.cnblogs.com/article/html/96/96231/index.shtml" target="_blank">孤心情劫 第一

    百零四章 孤心之心</a>"里的网址和标题.

    string RegexString = "<a href=/"(?<Url>.*?)/" target=/"_blank/">(?<Title>[^<].*?)</a>";

    string[] url = GetRegValue(HtmlCode, RegexString, "Url",  true);

    string[] title = GetRegValue(HtmlCode, RegexString, "Title", true);

    url[0]的值是"/files/article/html/96/96231/index.shtml",url[1]的值是"/files/article/html/95/95119/index.shtml"

    title[0]的值是"孤心情劫 第一百零四章 孤心之心",title[1]的值是"第一卷 第一百章 多重幻境"
  • 相关阅读:
    javascript 时间与时间戳的转换
    javascript 判断对象的内置类型
    javascript 动态脚本添加
    javascript select标签的操作
    javascript canvas画订单
    css 移动端图片等比显示处理
    FastDFS分布式文件系统
    欧拉回路--模板
    tarjan求双联通分量--POJ 1523 +P2860 [USACO06JAN]Redundant Paths G
    tarjan求割点和割边
  • 原文地址:https://www.cnblogs.com/AndyGe/p/2424532.html
Copyright © 2020-2023  润新知