REGEX匹配整个HTML文档

时间:2012-07-11 13:22:20

标签: c# html regex parsing

所以,我仍然是一个REGEX假人,过去两天才使用它们。但至少对我来说,我的问题似乎很奇怪。

以下模式为我正确匹配此字符串:

<td valign=3D\"top\">For:</td>(\\s)+(=)?(.|\r\n|\n)+<td>(([a-z]|[A-Z]|=|\\s)+)<br>

原始字符串(取自正在输入正则表达式的html文档作为输入):

<td valign=3D"top">For:</td>     =             <td>XXXXXX XXXXX<br>

和匹配的字符串:

<td valign=3D"top">For:</td>     =             <td>XXXXXX XXXXX<br>

但是对于这个字符串:

<td valign=3D"top">For:</td>                     <td>YYYYYYY=     YYYYY<br>

它匹配整个html文档。我不明白为什么会发生这种情况,因为在(([a-z]|[A-Z]|=|\\s)+我指定应该有<br>代码

之后

2 个答案:

答案 0 :(得分:2)

为非贪婪匹配添加指示的问号:

<td valign=3D\"top\">For:</td>(\\s)+(=)?(.|\r\n|\n)+?<td>(([a-z]|[A-Z]|=|\\s)+?)<br>
                                                    ^                         ^

修改

此外,您可以简化为字符类而不是使用替换:

<td valign=3D\"top\">For:</td>(\\s)+(=)?(.|[\r\n])+?<td>([a-zA-Z=\\s]+?)<br>
                                           ^^^^^^        ^^^^^^^^^^^^

我唯一的问题是,为什么\\s\r\n不是...... {/ p>}时被转义

编辑2:

使用*代替+,例如,空格不是必需的;在这些情况下,非贪婪量词可能总是有用的:

<td valign=3D\"top\">For:</td>(\\s)*?(=)?(.|[\r\n])*?<td>([a-zA-Z=\\s]*?)<br>
                                   ^^       ------ ^-     ------------^-

答案 1 :(得分:1)

使用正则表达式解析HTML是一个非常糟糕的主意。

在此处查看原因: RegEx match open tags except XHTML self-contained tags

即使在HTML中解析非常简单的事情,使用DOM Parser通常更清晰(更易读)且更不容易出错。如果您不熟悉REGEX的

,甚至更多