无限循环中的.NET正则表达式

时间:2008-11-27 14:56:37

标签: c# vb.net visual-studio regex

我正在使用.NET正则表达式来删除HTML代码。

使用类似的东西:

<title>(?<Title>[\w\W]+?)</title>[\w\W]+?<div class="article">(?<Text>[\w\W]+?)</div>

这种方法在99%的情况下有效,但有时候,在解析时...

Regex.IsMatch(HTML, Pattern)

解析器只是阻塞,它将继续在这行代码上持续几分钟或无限期。

发生了什么事?

3 个答案:

答案 0 :(得分:6)

当您的HTML字符串实际包含适合该模式的HTML时,您的正则表达式将正常工作。但是当你的HTML不适合这种模式时,例如如果缺少最后一个标记,您的正则表达式将展示我称之为“catastrophic backtracking”的内容。单击该链接并向下滚动到“快速匹配完整的HTML文件”部分。它完全描述了您的问题。 [\ W \ W] +?是一种复杂的说法。+?使用RegexOptions.SingleLine。

答案 1 :(得分:3)

通过一些努力,你可以在html上使用正则表达式 - 但是,你看过HTML agility pack吗?这使得使用html作为DOM更容易,支持xpath类型查询等(即“// div [@ class ='article']”)。

答案 2 :(得分:1)

你问你的正则表达式在那里做了很多。在每个字符之后,它必须向前看,看看下一部分文本是否可以与模式的下一部分匹配。

Regex是一种模式匹配工具。虽然您可以使用它进行简单的解析,但最好使用特定的解析器(例如HTML Agility包,如我的Marc所述)。