删行尾分号不能只写;$,必须处理分号后可能存在的空格、tab或不可见unicode空白(如\u00a0),否则大量“看似结尾”的分号会漏掉。

直接结论:删行尾分号不能只写 ;$,必须处理分号后可能存在的空格、Tab 或不可见 Unicode 空白(如 \u00A0),否则大量“看似结尾”的分号会漏掉。
为什么 ;$ 经常没反应?
不是正则写错了,而是分号后面藏着东西——肉眼看不见,但正则不匹配:
-
;后跟空格或 Tab:写成;或,<code>;$完全不匹配 - 存在不间断空格(
\u00A0):常见于从网页/文档复制的代码,\s能覆盖它,但[ \t]不行 - 文件末尾分号在换行符前:比如
foo();\n,;$可以匹配;但如果是foo(); \n(空格+换行),就失效
安全删除的正则怎么写?
用这个表达式最稳:;[ \t\u00A0]*$
-
;匹配字面分号 -
[ \t\u00A0]*明确覆盖普通空格、Tab 和不间断空格,比\s更可控(\s会误吞换行符) -
$锚定行尾,确保只删“行尾附近”的分号,不会误伤注释里的;// ... ;
操作路径:按 Ctrl + H(Win/Linux)或 Cmd + H(macOS)→ 勾选右下角 .*(启用正则)→ 查找框填 ;[ \t\u00A0]*$ → 替换框留空 → 点「全部替换」
删之前必须做的三件事
避免误删逻辑分号(如 SQL 语句结尾、多语句一行)或破坏语法:
- 先切换语法为
Plain Text(Ctrl + Shift + P→ 输入Set Syntax: Plain Text):排除高亮插件对;的语义干扰 - 开启可视化空格(
Preferences → Settings,加"draw_white_space": "all"):看清哪些是“真空白”,哪些是缩进或对齐空格 - 确认当前语言是否允许行尾分号:JSON/YAML 中加/删
;都是非法操作,硬删可能让后续校验失败
加分号反而更危险?
自动补分号比删除风险更高,尤其在 Python、HTML、JSON 等语言中:
- Python 不需要分号,加了虽不报错但违反 PEP 8,且可能掩盖
return后多打的分号导致逻辑异常 - SQL 中
;是语句分隔符,补在函数体内部(如IF ... ; END IF;)可能提前截断语义 - 加分号正则用
$→;,但得先确保目标行不是注释行、空行或字符串内——Sublime 原生正则无法识别语法上下文,纯靠人工判断范围
真正容易被忽略的是:删完分号后,某些语言(如 TypeScript)依赖分号做类型推导边界,而另一些(如 Go)强制不许有分号——动之前得看清楚这文件到底归谁管。











