zoukankan      html  css  js  c++  java
  • 正则表达式。取Html中Table中的Td里面的值

    网上看的正则,代没有找到正解,

    自己也在学正则,就当练习下,


       取值为:取这些html元素中td中的值。

    按着我刚学的思路取值应为匹配到td后,然后得到里面的值元素。

    在这里不得不说正则绝对是个好东西,一个* ? + .都代表着特牛X的定义,学着灵活应用真是不容易呀。

    原网址为:http://topic.csdn.net/u/20070619/14/B06B7337-0655-4245-9910-E93C1430F4AE.html

    里面也有解说也有高手分析,代本人试了,没通。所以我就看了上面高手的分析后,自己动手试了一把,在此谢谢 " 上海凤凰"这们网友的帮助


     <table>
    <tr>
    <td   width= "130 "     align= "center "   class= "td1"> asdgd1 </td>
    <td   width= "130 "     align= "center "   class= "td1"> asdgd1 </td>
    <td   width= "130 "     align= "center "   class= "td1"> asdgd1 </td>
    <td   width= "130 "     align= "center "   class= "td1"> asdgd1 </td>
    
    </tr>
    </table>

    以上的字符将其合名为 a,

    在C#后台里面,我将 双引号变为了单引号,便于变理的存储,然后不替换也行,将其转换为 \"这种模式;

    下面为各种情况的解决方法:

    在写正则的时候前面加上 @ 转义做用。

    1:<[^>]+>([^<>]+)<[^>]+>  ^是中括号中,是非的应用,第一个中括号指,不是>的字符的多个字符集合,因为后面有+号的存在;其后的几个是同理。

    2:<td.*>([^<>]+)</td> 这种用法,我觉的,会更快直接的找到范围匹配区域,在这里.*只要不是\n的字符,会匹配到>结束的位置,中间的([^<>]+)是匹配不是<>字符的字符集合,然后以</td>结束。

    对于以上的取值而言,因为中间全用了()来标明中间值区域,这意思是分组的用意,所以在reg.math(a).groups[i].value 来取值,记住 以分组来取的值可指定下标。

    以上为单一的值取,而不是集合。

    MatchCollection 为所取的集合,从而循环取出,

    用法其实一样,写法很多种不一一说明了,

    在这里说一个用法,<td[^>].*?>(?<content>[^<>]+)</td> 大家可以看出红色标识块,它的做用是方便取值时候,定义的一个分组名称,从下面的表中也可看出来。


    写的匹配有很多,大家可以试一下。


      成员名称 说明
      None 指定不设置选项。
      IgnoreCase 指定不区分大小写的匹配。
      Multiline 多行模式。更改 ^ 和 $ 的含义,使它们分别在任意一行的行首和行尾匹配,而不仅仅在整个字符串的开头和结尾匹配。
      ExplicitCapture 指定有效的捕获仅为形式为 (?<name>...) 的显式命名或编号的组。这使未命名的圆括号可以充当非捕获组,并且不会使表达式的语法 (?:...) 显得笨拙。
      Compiled 指定将正则表达式编译为程序集。这会产生更快的执行速度,但会增加启动时间。在调用 CompileToAssembly 方法时,不应将此值分配给 Options 属性。
      Singleline 指定单行模式。更改点 (.) 的含义,使它与每一个字符匹配(而不是与除 \n 之外的每个字符匹配)。
      IgnorePatternWhitespace 消除模式中的非转义空白并启用由 # 标记的注释。但是,IgnorePatternWhitespace 值不会影响或消除字符类中的空白。
      RightToLeft 指定搜索从右向左而不是从左向右进行。
      ECMAScript 为表达式启用符合 ECMAScript 的行为。该值只能与 IgnoreCaseMultilineCompiled 值一起使用。该值与其他任何值一起使用均将导致异常。
      CultureInvariant 指定忽略语言中的区域性差异。有关更多信息,请参见 在 RegularExpressions 命名空间中执行不区分区域性的操作。



            Regex reg1 = new Regex(@"<[^>]+>([^<>]+)<[^>]+>", RegexOptions.IgnoreCase);//此用于取一个时,不是集合时应用。
            string str = reg1.Match(a).Groups[1].Value;
    
            Regex reg12 = new Regex(@"<td.*>([^<>]+)</td>", RegexOptions.IgnoreCase);
            string str1 = reg12.Match(a).Groups[1].Value;
    
    
            MatchCollection match = Regex.Matches(a, @"<td[^>].*?>(?<content>[^<>]+)</td>", RegexOptions.Compiled);
            MatchCollection match2 = Regex.Matches(a, @"<[^>]+>(?<content>[^<>]+)<[^>]+>", RegexOptions.Compiled );  //Success
            MatchCollection match3 = Regex.Matches(a, @"<td.*?class= 'td1'>(?<content>[^<>]+)</td>", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture);
            MatchCollection match4 = Regex.Matches(a, @"<td[^>]+>(?<content>[^<>]+)</td>", RegexOptions.Compiled);
    
            string a1 = "<table><tr><td   width= \"130 \"     align= \"center \"   class= \"td1\"> 你们好哇ffff </td><td   width= \"130 \"     align= \"center \"   class= \"td1\"> 你们好哇 </td></tr>";
            MatchCollection match5 = Regex.Matches(a1, @"<td.*?class= \""td1\"">(?<content>[^<>]+)</td>", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture);
    
    
            foreach (Match m in match5)
            {
                Response.Write(m.Groups["content"].Value + " <br> ");
            }
    



    下载代码


    以上东西有网上的,有看过自己写的

    本人在学习,有那链接,人接受不了,请通知,立刻删除。

    转截的时候请注上本人网址


    3Q








  • 相关阅读:
    hdu 2647 Reward
    hdu 2094 产生冠军
    hdu 3342 Legal or Not
    hdu 1285 确定比赛名次
    hdu 3006 The Number of set
    hdu 1429 胜利大逃亡(续)
    UVA 146 ID Codes
    UVA 131 The Psychic Poker Player
    洛谷 P2491消防 解题报告
    洛谷 P2587 [ZJOI2008]泡泡堂 解题报告
  • 原文地址:https://www.cnblogs.com/yhongl/p/3937909.html
Copyright © 2011-2022 走看看