C# 匹配整个HTML文档的正则表达式

C# 匹配整个HTML文档的正则表达式,c#,html,regex,parsing,C#,Html,Regex,Parsing,所以,我仍然是一个正则表达式的傀儡,在过去的两天里才开始使用它们。然而,至少对我来说,我的问题似乎很奇怪 以下模式与我的此字符串正确匹配: <td valign=3D\"top\">For:</td>(\\s)+(=)?(.|\r\n|\n)+<td>(([a-z]|[A-Z]|=|\\s)+)<br> For:(\\s)+(=)?(.|\r\n |\n)+([a-z]|[a-z]|=|\\s)+ 原始字符串(取自作为输入提供给正则表达式的ht

所以,我仍然是一个正则表达式的傀儡,在过去的两天里才开始使用它们。然而,至少对我来说,我的问题似乎很奇怪

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

<td valign=3D\"top\">For:</td>(\\s)+(=)?(.|\r\n|\n)+<td>(([a-z]|[A-Z]|=|\\s)+)<br>
For:(\\s)+(=)?(.|\r\n |\n)+([a-z]|[a-z]|=|\\s)+
原始字符串(取自作为输入提供给正则表达式的html文档):

For:=XXXXXX XXXXX
和匹配的字符串:

<td valign=3D"top">For:</td>     =             <td>XXXXXX XXXXX<br>
For:=XXXXXX XXXXX
但是,对于此字符串:

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

它匹配了整个html文档。我不明白为什么会发生这种情况,因为在我的
([a-z]|[a-z]|=| \\s)+
之后,我指定应该有一个

标记

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

请参见此处的原因:


即使是在HTML中解析非常简单的东西,使用DOM解析器通常也更干净(可读性更高)且不容易出错。如果您不熟悉REGEX的

则使用REGEX解析HTML是一个非常糟糕的主意

请参见此处的原因:


即使是在HTML中解析非常简单的内容,使用DOM解析器通常也更干净(可读性更强)且更不容易出错。如果您不熟悉REGEX的

,请为非贪婪匹配添加指定的问号:

<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|\n)+?<td>(([a-z]|[A-Z]|=|\\s)+?)<br>
                                                    ^                         ^

1) 到底什么是
valign=3D“top”
?2) 解析DOMs的正则表达式=坏主意,除非您确实有很好的理由这样做。最好在它上面使用DOM方法来提取您需要的东西。学习正则表达式很好(这是一个非常好的主意),只是您不想通过HTML字符串来学习它。如果HTML格式有点不正确或不可预测(或者,在您的情况下,完全无效),正则表达式将失败。正则表达式不是解析器。在任何情况下,您都必须解决无效的HTML问题,但是-在解决此问题之前,您的任务几乎是一个无起点的任务。您的
(.|\r\n)
组是多余的,点匹配任何字符,因此
\r\n
将永远无法到达。此外,您还可以将许多
(x | y | z)
部分简化为字符类。例如,
([a-z]|[a-z]|=| \\s)+
可以简化为
[a-zA-z=\\s]
。此外,在匹配空格时,尤其是在HTML中,请尝试使用
*
重复字符,而不是
+
。您无法用普通的旧regexp解析嵌套结构。1)究竟什么是
valign=3D“top”
?2) 解析DOMs的正则表达式=坏主意,除非您确实有很好的理由这样做。最好在它上面使用DOM方法来提取您需要的东西。学习正则表达式很好(这是一个非常好的主意),只是您不想通过HTML字符串来学习它。如果HTML格式有点不正确或不可预测(或者,在您的情况下,完全无效),正则表达式将失败。正则表达式不是解析器。在任何情况下,您都必须解决无效的HTML问题,但是-在解决此问题之前,您的任务几乎是一个无起点的任务。您的
(.|\r\n)
组是多余的,点匹配任何字符,因此
\r\n
将永远无法到达。此外,您还可以将许多
(x | y | z)
部分简化为字符类。例如,
([a-z]|[a-z]|=| \\s)+
可以简化为
[a-zA-z=\\s]
。此外,在匹配空格时,尤其是在HTML中,请尝试使用
*
重复字符,而不是
+
。你不能用普通的旧regexp解析嵌套结构。通常我会发布消息,但你已经证明你只是在尝试构建其他代码。向我们保证,如果从一开始你就选择使用正则表达式,那么你就不会使用它,我想我们会让你放心的哈哈,我保证,说它仍然符合整个文档:(仍然不起作用:(…因为根据我所读到的内容,s是一个空格,因此我需要\\来转义\从而为正则表达式引擎提供\s。只使用\s,编译器会抱怨\s不是有效的转义字符。实际上,这是因为您使用的是
+
量词,其中
*
更合适ng
+
,如果可能存在“无”的情况,则需要“至少一个”。请参见编辑2。通常我会发布小马即将到来,但您已经证明您只是在尝试构建其他代码。向我们承诺,如果从一开始就选择使用正则表达式,您就不会使用它,我想我们会对您置之不理。;)哈哈,我保证,说它仍然符合整个文档:(仍然不起作用:(…因为根据我所读到的内容,s是一个空格,因此我需要\\来转义\从而为正则表达式引擎提供\s。只使用\s,编译器会抱怨\s不是有效的转义字符。实际上,这是因为您使用的是
+
量词,其中
*
更合适ng
+
,如果可能存在“无”,则需要“至少一个”。请参见编辑2。
<td valign=3D\"top\">For:</td>(\\s)+(=)?(.|[\r\n])+?<td>([a-zA-Z=\\s]+?)<br>
                                           ^^^^^^        ^^^^^^^^^^^^
<td valign=3D\"top\">For:</td>(\\s)*?(=)?(.|[\r\n])*?<td>([a-zA-Z=\\s]*?)<br>
                                   ^^       ------ ^-     ------------^-