Sublime Text 正则替换失效主因是引擎行为、引用语法和跨行逻辑不一致:^s$ 误删换行符;捕获组查找用 \1、替换用 $1;跨文件需 Ctrl+Shift+F;跨行用 (?s) 而非 .;中文匹配用 [u4e00-u9fa5]。

Sublime Text 的正则查找替换不是“开了.*就能用”,真正卡住人的地方是引擎行为、引用语法和跨行逻辑不一致——写对了却没反应,八成是这三个地方出了问题。
为什么 ^s*$ 删不掉空行?
因为 s 在 Sublime 里默认匹配换行符,^s*$ 实际会吞掉换行本身,导致行边界错乱;更糟的是,如果勾选了 . matches newline,^ 和 $ 就不再按行生效。
- 删「纯空行」(不含空格):查找
^R,关闭. matches newline,替换留空 - 删「含空格/Tab 的空行」:查找
^[ ]*$R?,同样关闭. matches newline - 末尾多出一个换行?再补一次查找
R$,替换为空 - 别用
s替代[ ]——除非你真想匹配换行并破坏结构
$1 和 到底哪个该用?
这是最常写错的点:查找时用 引用捕获组,替换时必须用 ;写成 或 都会原样输出字符,不解析。
- 查找:
url("([^"]*)")→ 想提取引号内路径 - 替换:
background-image: url("/static/$1")(正确) - 替换:
background-image: url("/static/")(错误,输出字面 ) - 想输出字面
$?写成$$ - 嵌套括号编号按左括号顺序算:
(a(b(c)))中$1是abc,$2是bc,$3是c
跨文件批量替换总失效?
Ctrl+H 的「替换全部」只作用于当前文件;想改整个项目,必须用 Ctrl+Shift+F(Find in Files),否则白忙活。
- 先按
Ctrl+Shift+F打开全局面板 - 勾选右下角
.*启用正则 - 在
Where栏填路径,比如src/js/*.js或留空查当前文件夹 - 务必先点
Find预览匹配结果——尤其注意是否命中目标文件 - 替换后不会自动保存,要手动执行
File → Save All或Ctrl+K→Ctrl+B
大文件卡死或匹配不到?
不是正则写得不够 fancy,而是高亮预览和贪婪匹配拖垮了性能,或者换行符根本没被识别。
- 关掉
Highlight matches和Auto expand selection(菜单 → Find) - 跨行匹配不用
[sS]*,改用(?s)start(.*?)end更可靠 - 避免
.*开头,换成[^"]*这类否定字符集限定范围 - 中文匹配别依赖
w(它不认汉字),用[u4e00-u9fa5]或(?u)p{Han} - 不确定是否生效?先用
Ctrl+F单独测试查找逻辑,再进替换面板
真正麻烦的从来不是怎么写正则,而是 Sublime 对换行、引用、引擎模式的隐式约束——每次替换前花 10 秒验证查找是否命中,比事后调试快十倍。


















