【问题标题】:.NET Regular Expressions in Infinite Cycle无限循环中的 .NET 正则表达式
【发布时间】:2008-11-27 14:56:36
【问题描述】:

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

使用类似的东西:

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

这在 99% 的情况下都有效,但有时在解析时...

Regex.IsMatch(HTML, Pattern)

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

发生了什么事?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多