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>
^^ ------ ^- ------------^-