试图在C#中使用正则表达式获取整个<div>

use*_*330 0 html c# regex

我正在尝试在C#中刮整个div元素...

我已经尝试过了, div class="txt-block"\s*(.+?)(\r\n?|\n)\s*"但是它并没有刮擦整个:(有什么想法吗?

    <div class="txt-block" itemprop="creator" itemscope itemtype="http://schema.org/Person"> 
    <h4 class="inline">Writers:</h4>
    <a href="/name/nm1318843/?ref_=tt_ov_wr" itemprop='url'><span class="itemprop"    itemprop="name">Mark Fergus</span></a>               (screenplay), 
    <a href="/name/nm1319757/?ref_=tt_ov_wr" itemprop='url'><span class="itemprop"         
    itemprop="name">Hawk Ostby</span></a>               (screenplay), <a href="fullcredits?ref_=tt_ov_wr#writers" >6 more credits</a>&nbsp;&raquo;
</div> 
Run Code Online (Sandbox Code Playgroud)

Sua*_*ere 5

为什么要这么多否决票?因为您不会使用Regex解析HTML,所以不允许他吗?这是非常狭narrow的。

我已经看到很大一部分时间htmlagilitypack无法正确解析格式错误的html文档,或者无法解析大量捕获的串联或嵌套的HTML文档。否则,任何形式的XPath都不起作用,因为HTML文档是动态创建的,不一致的,并且不一定包含标识属性。当一个非常简单的正则表达式更可靠时,为什么还要导入额外的include并解决草率的标记呢?

如果您有一个大型项目,而该项目中的一个方法只需要提取输入HTML文档的DIV内容,该怎么办?它不是一个完整的HTML解析项目,只需要一个正则表达式即可。您的答案是包括更多导入,并为此构建一个全新的框架?我一年要做数百个项目。一半使用DOM / XPath,另一半根本不使用,并且需要Regex。

简而言之,不要那么狭narrow。参考XPath / DOM工具,但有助于回答问题。不要只是拒绝投票。我们不是尼安德特人,他们需要一直嘲笑一个古老的“永远不要用正则表达式解析HTML”一文。

答案如下:

一,单纯形:

(?s)<div.*?>(.*?)</div>
Run Code Online (Sandbox Code Playgroud)

需要一个特别命名的div吗?

(?s)<div[^>]*?class="txt-block"[^>]*?>(.*?)</div>
Run Code Online (Sandbox Code Playgroud)

是否希望节省CPU并避免不必要的回溯?

<div[^>]*?class="txt-block"[^>]*?>(([^<]*(?(?!</div>)<))*)</div>
Run Code Online (Sandbox Code Playgroud)

上面假设您没有嵌套的DIV项目。那就是不使用Regex的整个想法真正发挥作用的时候。除非您使用的是C#.Net。在这种情况下,您只需要这样做:

(?xm)
    (?>
        <(?<Tagname>div)[^>]*?class="txt-block"[^>]*>
)
(?(Tagname)
    (
        </(?(?!\k'Tagname')(?<-Tagname>))*\k'Tagname'>(?<-Tagname>)
    |
        (?>
            <(?<Tagname>[a-z][^\s>]*)[^>]*>
        )
    |
        [^<]+
    )+?
    (?(Tagname)(?!))
)
Run Code Online (Sandbox Code Playgroud)

或者,单行版本:

(?m)(?><(?<Tagname>div)[^>]*?class="txt-block"[^>]*>)(?(Tagname)(</(?(?!\k'Tagname')(?<-Tagname>))*\k'Tagname'>(?<-Tagname>)|(?><(?<Tagname>[a-z][^\s>]*)[^>]*>)|[^<]+)+?(?(Tagname)(?!)))
Run Code Online (Sandbox Code Playgroud)

选择你的毒药。正则表达式比人们想象的更强大,更可靠。我发布的最复杂的示例不适用于Regex Buddy,但适用于任何.Net框架。Regex Buddy不支持Balancing Groups,这是一种.Net风格。