]*>无法匹配空标签,因其仅匹配单个标签,无法识别起始与结束标签间的空白内容;真正清理需用跨行正则]*)>[\s\s]*?配合反向引用,并辅以^s*$清除残留空行。

]*> 不能匹配空标签(比如 <div></div> 或 <p class="x"></p>),它只删单个标签,不处理嵌套结构。真要清理空标签,得用两层正则配合逻辑判断,不是“一键”能搞定的事。
为什么 ]*> 对空标签完全无效
这个正则只匹配「以 开头、中间不含 <code>>、以 > 结尾」的片段,比如 <div>、<code>、<img src="">。但它对 <div></div> 这种由两个独立标签组成的结构毫无感知——它最多分两次匹配,删完只剩裸文本,根本识别不出“这对标签之间没内容”。
- 它不跨标签边界,无法捕获起始+结束标签之间的空白或换行
- 遇到
<div> </div>这类含空白符的,]*>只删掉两边,中间的留着,看起来还是“空”,但已不是 HTML 标签了 - 如果中间有注释
<!-- -->或实体,它更不会认为那是“非空”,只会照常删标签,留下垃圾
怎么真正匹配一对空标签(含空白)
必须用支持跨行、能捕获起始与结束标签之间内容的写法。Sublime 的 PCRE 引擎默认不跨行,所以第一步要勾选 . matches newline(即让 . 能吞换行符)。
- 查找:
]*)>[sS]*? - 替换:
(留空) - 关键点:
是反向引用,确保起始和结束标签名一致(<div>...</div>可以,<div>... 不会误删)<li> <code>[sS]*?是跨行非贪婪匹配,覆盖换行、空格、制表符,但不会一路吃到文件末尾 - 先跑一遍空标签正则(勾选
. matches newline) - 再关掉
. matches newline,用^s*$删除所有空行(含伪空行) - 如果想保留段落间距,改用
s* s* +→,压缩连续空行为双换行 - 别在“Find in Files”里批量跑空标签正则——Sublime 对跨行匹配 + 多文件的支持极不稳定,容易漏匹配或卡死
- 嵌套错误:比如
<div><p>text</p></div>(实际是<div><p>text</p></div>的错位) - 命名空间标签:
<rect></rect>中的svg:会让失效 - 大小写混用:
<div></div>不会被匹配(PCRE 默认区分大小写) - 性能崩溃:Sublime 在 >500KB 文件上执行跨行正则,响应延迟明显,甚至丢数据
注意:这个表达式仍不处理自闭合标签(如 <br>)、带条件注释的 IE 标签(<!--[if]--><div>),也不跳过 <code><script></script> 内部——如果目标 HTML 含这些,得先单独剥离 script/style 块。
删完空标签后,为什么还剩一堆空行和缩进?
因为正则只删标签,不删标签之间的换行、空格、制表符。原始 HTML 中 <div>
<p></p>
</div> 删掉标签后,剩下
,这就是“视觉空行”,^s*$ 才能清掉它。
什么时候该放弃 Sublime 正则,换工具?
当你面对的是微信公众号导出 HTML、邮件正文、爬虫抓取的富文本,或者文件 >200KB 时,]*)>[sS]*? 就只是个试探性操作。它无法处理:
文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。
真正要鲁棒清理,Python 里用 BeautifulSoup 遍历 find_all + string.strip() == "" 判断,或浏览器控制台跑 document.querySelectorAll('*:empty') 手动验证,才是可靠路径。Sublime 正则只适合你已确认结构规整、量小、且接受“删掉再说”的临时场景。










