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 内容(例如a&nbsp; &middot;&nbsp;&middot;&nbsp;&middot;)和最后一个 div 中的内容(例如bbbb

但我希望它匹配 h2 和 div 中的所有内容以制作一对一的地图(例如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 回答