0

干し草の山:

<h2 >a&nbsp; &middot;&nbsp;&middot;&nbsp;&middot;
</h2>
<div class="indent">
aaaa
</div>
<h2 >b&nbsp; &middot;&nbsp;&middot;&nbsp;&middot;
</h2>
<div class="indent">
bbbb
</div>

私が使用したパターン:

#<h2[^>]*>(a|b)(?!</h2>)[\s\S]*</h2><div class="indent">((?!</div>)[\s\S]+)</div>#

このパターンは、最初のh2コンテンツ(eg a&nbsp; &middot;&nbsp;&middot;&nbsp;&middot;)と最後のdiv(eg bbbb)のコンテンツにのみ一致します

しかし、h2とdivのすべてのコンテンツを一致させて、1対1のマップ(例:a&nbsp; &middot;&nbsp;&middot;&nbsp;&middot;=> aaaab&nbsp; &middot;&nbsp;&middot;&nbsp;&middot;=> bbbb)を作成したいのですが、これを行うにはどうすればよいですか?

4

1 に答える 1

1

[\s\S]*貪欲です。つまり、[\s\S]+できるだけ多くの文字に一致します。[\s\S]*?それらをとに変更してみてください[\s\S]+?

現在の正規表現では[\s\S]*、キャプチャグループに入れると、次のように一致することがわかります。

&nbsp; &middot;&nbsp;&middot;&nbsp;&middot;
</h2>
<div class="indent">
aaaa
</div>
<h2 >b&nbsp; &middot;&nbsp;&middot;&nbsp;&middot;

最後にを追加する?と、これが怠惰になるため、可能な限り一致するのではなく、可能な限り少ない文字に一致するため、最初の文字で停止し</h2>ます。同じ理由が[\s\S]+、正規表現の後半にも当てはまります。

また、正規表現の途中にあるため、これはサンプル文字列で失敗するはずですが、サンプルテキストでは、終了との</h2><div...間に常に改行があります。おそらく、このセクションをに変更する必要があります。最終結果:</h2><div></h2>\s*<div...

#<h2[^>]*>(a|b)(?!</h2>)[\s\S]*?</h2>\s*<div class="indent">((?!</div>)[\s\S]+?)</div>#

ただし、正規表現を使用してHTMLを解析しないでください。

于 2012-06-14T22:40:31.347 に答える