我有250块HTML列表项,我需要删除<h3></h3>
标记之间的特定行。
需要删除的行(包括h3, li, a)将包含"USPS"
<ul>
<h3>
<li><a href="medicine/Alabama/Birmingham">Medicine in Birmingham, AL</a>
</li>
</h3>
<h3>
<li><a href="/shampoo/Alabama/Birmingham">Shampoo in Birmingham, AL</a>
</li>
</h3>
<h3>
<li><a href="/usps/Alabama/Birmingham">USPS in Birmingham, AL</a></li>
</h3>
<h3>
<li><a href="/snacks/Alabama/Birmingham">Snacks in Birmingham, AL</a></li>
</h3>
</ul>
<ul>
<h3>
<li><a href="/medicine/Arizona/Mesa">Medicine in Mesa, AZ</a></li>
</h3>
<h3>
<li><a href="/shampoo/Arizona/Mesa">Shampoo in Mesa, AZ</a></li>
</h3>
<h3>
<li><a href="/usps/Arizona/Mesa">USPS in Mesa, AZ</a></li>
</h3>
<h3>
<li><a href="/snacks/Arizona/Mesa">Snacks in Mesa, AZ</a></li>
</h3>
</ul>
我试过使用正则表达式,但它删除太多。我在这里保存了最近一次regex尝试的链接:https://regex101.com/r/l4Ud4v/1
(?s)<h3>.*USPS.*?</h3>
所需结果:
<ul>
<h3>
<li><a href="medicine/Alabama/Birmingham">Medicine in Birmingham, AL</a>
</li>
</h3>
<h3>
<li><a href="/shampoo/Alabama/Birmingham">Shampoo in Birmingham, AL</a>
</li>
</h3>
<h3>
<li><a href="/snacks/Alabama/Birmingham">Snacks in Birmingham, AL</a></li>
</h3>
</ul>
<ul>
<h3>
<li><a href="/medicine/Arizona/Mesa">Medicine in Mesa, AZ</a></li>
</h3>
<h3>
<li><a href="/shampoo/Arizona/Mesa">Shampoo in Mesa, AZ</a></li>
</h3>
<h3>
<li><a href="/snacks/Arizona/Mesa">Snacks in Mesa, AZ</a></li>
</h3>
</ul>
有250个这样的&;usps &;需要删除的实例,同时保留HTML的其余部分。
Try
(?s)<h3>(?:(?!</h3>).)*USPS.*?</h3>
https://regex101.com/r/AB6wxS/1
即使是非贪婪的(?s)<h3>.*?USPS.*?</h3>
也会失败,因为它将匹配第一个<h3>
,然后消耗,直到找到USPS,匹配结束标记。为了避免这种情况,你可以使用(?:(?!</h3>).)*
,它基本上表示匹配任何字符,只要它不是</h3>
的开头。
如果你对所有行都有特定的格式(h3, li, a),并且你想在Sublime中匹配它们:
<h3>s*<li>s*<ab[^<>]*>[^<>]*bUSPSb[^<>]*</a>s*</li>s*</h3>
s*
匹配可选的空白字符,[^<>]*
是一个反字符类,匹配任何字符,包括换行符,除了<
和>
查看regex演示。