试图得到一个完整的
本文关键字:一个 | 更新日期: 2023-09-27 18:12:54
c#中的正则表达式。
我试图在c#中刮掉整个div元素…
我试过div class="txt-block"'s*(.+?)('r'n?|'n)'s*"
,但它不能把它刮干净。什么好主意吗?这是div..谢谢!
<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> »
</div>
首先是单复数:
(?s)<div.*?>(.*?)</div>
需要一个特别命名的div?
(?s)<div[^>]*?class="txt-block"[^>]*?>(.*?)</div>
想要节省CPU并避免不必要的回溯?
<div[^>]*?class="txt-block"[^>]*?>(([^<]*(?(?!</div>)<))*)</div>
以上假设没有嵌套的DIV项。这就是不使用Regex的整个想法真正发挥作用的时候。除非你正在使用c#。net。在这种情况下,您只需这样做:
(?xm)
(?>
<(?<Tagname>div)[^>]*?class="txt-block"[^>]*>
)
(?(Tagname)
(
</(?(?!'k'Tagname')(?<-Tagname>))*'k'Tagname'>(?<-Tagname>)
|
(?>
<(?<Tagname>[a-z][^'s>]*)[^>]*>
)
|
[^<]+
)+?
(?(Tagname)(?!))
)
或者,单行版本:
(?m)(?><(?<Tagname>div)[^>]*?class="txt-block"[^>]*>)(?(Tagname)(</(?(?!'k'Tagname')(?<-Tagname>))*'k'Tagname'>(?<-Tagname>)|(?><(?<Tagname>[a-z][^'s>]*)[^>]*>)|[^<]+)+?(?(Tagname)(?!)))
我发布的最复杂的例子不能在Regex Buddy中工作,但可以在任何。net框架中工作。Regex Buddy不支持平衡组,这是一个。net风格。
用regex解析HTML不是一个好主意。试着在c#中找到一个解析HTML的库。
经过快速搜索,我找到了这个库:http://htmlagilitypack.codeplex.com/似乎这个库具有您需要的所有功能。