Sublime正则替换关键在理解边界条件而非死记公式:^s$因\s匹配\n且Windows下$停在 前而失效;HTML属性需用1而非.*?;中文混排时s不匹配全角空格等Unicode空白。" ↩

Sublime 的正则替换不是“开个.*就能用”,10 个所谓“常用公式”里,至少 4 个在真实脏数据中会漏匹配、跨标签、吞内容或卡死——关键不在记公式,而在理解每条正则的边界条件和失效场景。
为什么 ^s*$ 删不掉所有空行
因为 ^s*$ 中的 s 匹配
,它会把两个空行之间的换行符也吃掉,导致只删掉“可见空白”,却留下逻辑空行;更糟的是,Windows 的
下 $ 停在
前,末尾残留回车。
- 真正可靠的写法是:
^[ ]*$(只匹配空格和制表符),再配合s*Z补最后一行 - 先统一换行符:右下角点击
Windows (CRLF)→ 切成Unix (LF) - 如果文件末尾没换行符,
^$永远不会命中最后一行——必须加s*Z兜底
提取 HTML 属性值时 .*? 为什么总吃错
比如用 title=".*?" 提品牌名,遇到 title="Xiaomi < Redmi >" 或 title="Apple"Inc" 就崩:前者被 < 截断,后者因引号转义失败而跨到下个属性。
- 正确写法:
title="([^"]*)"或data-brand=['"]([^'"]*)['"] - 绝对不要用
.*?处理带引号/转义的内容——否定字符集才是安全边界 - 若源码含 JS 字符串(如
console.log('<div>')),先用 <code><script>]*>[sS]*?</script>清脚本块,否则]*>也会误杀保序去重为什么点了 Replace All 还有重复
^(.*$) (?=.*^$)看似完美,但实际运行中常漏删——根本原因是换行符不统一、行尾有不可见空格、或文本含零宽字符。- 必须前置三步:
^[ ]*$清空行 →[ ]+$清行尾空格 → 切换为Unix (LF)换行格式 - 勾选
. matches newline(Alt+R),否则不参与匹配 - 大文件(>3MB)容易卡死,此时应放弃预查,改用
Sort Lines: Unique(仅限可打乱顺序的场景)
中文混排时 s 为什么连全角空格都匹配不到
s只认 ASCII 空白(、、等),对中文全角空格(U+3000)、不间断空格(U+00A0)、零宽空格(U+200B)完全无效——这是汉化界面下清洗断裂最常见原因。- 查找全角空格:直接复制一个进查找框,或写
u3000 - 批量清理混合空白:
[ u3000u00A0u2000-u200Bu2028u2029]+→ 替换为单个半角空格 - 若要保留段落空行,改成:
[ u3000u00A0u2000-u200Bu2028u2029]+(?=S)
真正难的从来不是写出一条能跑的正则,而是判断它在哪种边界条件下会失效——比如
^#在 Windows 粘贴文本里必然失准,id="(w+)"遇到id="user-123"就抓空,.*?在含换行的 JSON 字段里直接跨块。这些细节不靠试错,靠提前拆解输入结构。 - 必须前置三步:

















