如何在两个H3标签之间的崇高文本中找到/替换正则表达式?



我有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演示。

最新更新