正则表达式。取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








posted @ 2011-12-21 13:11  凡海雨  阅读(1358)  评论(0编辑  收藏  举报