正则表达式。取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 的行为。该值只能与 IgnoreCase、Multiline 和Compiled 值一起使用。该值与其他任何值一起使用均将导致异常。 | |
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