sublime中可用正则标记独有行:先分段加#a/#b标记,再替换为#a_only/#b_only;清洗需用(?s)跨行捕获并保留分隔符;验证字段数则用alt+enter查找全部后统计行数。

怎么用正则在 Sublime 里快速比对两份文本的差异
Sublime 没有内置 diff 工具,但可以通过正则把「只在 A 有、B 没有」或「只在 B 有、A 没有」的行显式标出来,本质是把比对问题转成「行级存在性判断」。关键不是找相同,而是找缺失。
操作前先把两份文本并排贴进同一个 Sublime 文件,用明显分隔符(比如 === SECTION A === 和 === SECTION B ===)隔开,确保每份文本都是独立段落、无空行混杂。
- 想标出「A 有但 B 没有」的行:先选中 A 段全部内容 →
Ctrl+Shift+L转为多光标 → 对每个光标所在行,在行尾加一个唯一标记,比如#A(注意前面有个空格) - 再选中 B 段全部内容 → 同样
Ctrl+Shift+L→ 行尾加#B - 然后按
Ctrl+H,查找^(.*?)( #A)$,替换为$1 #A_ONLY;再查^(.*?)( #B)$,替换为$1 #B_ONLY - 最后搜
#A_ONLY或#B_ONLY就能快速定位独有行
注意:这个方法依赖人工分段和标记,不适合上千行自动比对,但对几十到几百行的手动核对非常直观,且不依赖插件。
清洗时怎么避免把两份文本的共用字段误删
常见错误是写了个宽泛正则(比如 \d{6,})去删 ID,结果把 A 的用户 ID 和 B 的订单号全干掉了——因为没限定上下文。必须靠锚点把匹配范围死死锁在某一段内。
例如,你想只清理 A 段里的邮箱,但 B 段保留原样:
- 先用
Ctrl+F定位到=== SECTION A ===,按Ctrl+Shift+Enter在它上面插入空行,再按Ctrl+Enter在它下面也插一行,让 A 段被空行包围 - 启用正则模式(
Alt+R),查找:(?s)(=== SECTION A ===\r?\n\r?\n)(.*?)(\r?\n\r?\n=== SECTION B ===) - 这个正则用
(?s)开启单行模式,让.*?能跨行匹配 A 段全部内容;三个捕获组分别存分隔符、A 段正文、后置分隔符 - 替换填:
$1@#@#@#@#@#@#@#@#@#@0$3(或其他清洗逻辑),这样只动$2部分,前后分隔结构完全保留
别省略分隔符捕获组——漏掉 或 ,替换后整个结构就塌了。
为什么 ^ 和 $ 在跨段清洗时经常失灵
因为 Sublime 默认的 ^/$ 是「行首/行尾」锚点,但当你用 (?s) 开启单行模式后,. 会匹配换行符,^ 和 $ 却不会自动变成「段首/段尾」——它们仍然只认 `\n` 前后的位置,而你的分隔符可能是 \r\n 或夹着空行,导致锚点漂移。
实操解法只有两个:
- 不用
^/$,改用明确字符锚定:比如把^ID:\s*\d+改成ID:\s*\d+(?=\r?\n)(后面必须跟换行) - 手动统一换行符:右下角点击当前换行格式(如
Windows (CRLF)),切换成Unix (LF),再用^\s*#.*$这类经典写法才可靠
中文界面下尤其容易踩这个坑——某些汉化插件会干扰换行符识别,切回 Plain Text 语法(Ctrl+Shift+P → Set Syntax: Plain Text)再试。
清洗后怎么验证两份文本的字段数量是否一致
最直接的方式是用正则批量提取关键字段(如手机号、邮箱、URL),再对比行数。但 Sublime 没有 find_all 函数,得靠「查找全部 + 复制计数」模拟。
例如统计所有邮箱数量:
- 按
Ctrl+F,输入邮箱正则:[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,},勾选.*和Wrap around - 按
Alt+Enter(查找全部),所有匹配项被高亮 - 按
Ctrl+Shift+P,输入Copy Selected Text并执行 —— 此时剪贴板里是所有邮箱,每行一个 - 新建标签页粘贴,按
Ctrl+Shift+P→Selection: Count Lines(如果装了 Enhanced Selection 插件)或手动看状态栏行数
注意:别用 \b 做词边界,中文混排时它不可靠;用 (? 和 <code>(?!\w) 替代更稳。另外,提取后建议立刻 Ctrl+K Ctrl+U 转小写,避免大小写导致重复计数。











