解析中のページには多数の Web リンクがあります。特定のサブ要素を含むものを除くすべてのh3リンクをキャプチャしたいと考えています。
例のページ:
<h3 class="r">
<a href="http://Capture This"></a>
</h3>
<some tags here>
<more tags here>
<a bit more tags here>
</div>
</div>
<h3 class="r">
<a href="http://Capture This"></a>
</h3>
<some tags here>
<class=ml>
<more tags here>
<class=tcl>
<a bit more tags here>
</div>
</div>
<h3 class="r">
<a href="http://Dont capture this"></a>
</h3>
<some tags here>
<class=ml>
<more tags here>
<a bit more tags here>
</div>
</div>
h3 リンクをキャプチャします。
- class=mlサブ要素を含まないもの
- または class ml およびclass=tcl要素を含む
この正規表現は、すべてのh3リンクに一致します。
h3 class=["']?[^"']+["']?><a href=["']?(https?://[^"']+)["']?
この正規表現は、サブ要素にclass=mlがないすべてのh3リンクに一致します (各h3要素は doulbe /div タグで区切られています)。
h3 class=["']?r["']?><a href=["']?(https?://[^"']+)["']?(?=((?!class=ml).)*(</div>){2,})
最後に、私が探している正規表現は、 class=mlを含まない、またはサブ要素にclass=mlとclass=tclの両方を含むすべてのh3リンクをキャプチャします (この順序で)
h3 class=["']?[^"']+["']?><a href=["']?(https?://[^"']+)["']?(?=((?!class=ml)(?!(</div>){2,}).)*(class=ml((?!class=tcl>).)*class=tcl>|(</div>){2,}))
私が持ってきた正規表現は機能しますが、バックトラッキングのために非常に非効率的です. たとえば、標準のページ マッチングを 100 回繰り返すと、完了するまでに 50 秒かかります。この正規表現を改善する方法はありますか?
クトゥルフの方法でHTML を解析することが実際にどのようなものかを理解し始めたと思いますが、それが誰かの睡眠を妨げないことを願っています。
PS私は.NET正規表現エンジンを使用しています.それが私のオプションに影響する場合.