Sublime中.不能跨行匹配换行符,因PCRE引擎默认.不匹配\n;需显式用\n、\r\n或[\s\S]替代,且跨行替换须勾选“. matches newline”并注意保存与大文件性能问题。

Sublime 里不能靠 .* 跨行匹配换行符,必须显式写 \n 或用 [\s\S] 绕过 —— 这是 90% 用户卡住的根源。
为什么 .* 找不到换行符?
Sublime 默认正则引擎(PCRE)中 . 不匹配换行符,哪怕你肉眼看到两行之间有空行,start.*end 也只停在第一行末尾。这不是 bug,是标准行为。
常见错误现象:
- 输入
function.*{想匹配函数体,结果只高亮到行尾 - 替换框里写
\n却替换了两个字符「\」和「n」——因为正则没开 - 删空行用了
^\s*$却没删掉换行本身,导致文件末尾多出空白行
解决办法只有两个:
- 手动写出换行符:
\n(Unix/macOS)或\r\n(Windows),实际文件用什么就写什么 - 用
[\s\S]代替.*:它明确表示“任意空白或非空白字符”,天然跨行,兼容所有平台
怎么安全地删除或合并换行符?
直接替换 \n 风险很高:可能把 \r\n 拆成 \r 和孤立的 \n,Git 提交时会报 CRLF/LF 不一致。
推荐做法:
- 统一换行符再操作:先用
File → Reopen with Encoding → UTF-8确保编码干净,再用View → Line Endings → Unix (LF)或Windows (CRLF)强制转义 - 删空行(含纯空白行):
Find:^\s*$\n,Replace: 空 —— 注意结尾的\n是要删掉的换行符本身 - 合并连续换行为单个空格:
Find:\n,Replace:(一个空格) - 把多个换行压成两个:
Find:\n{3,},Replace:\n\n
跨行内容替换为什么总失败?
比如想把
print("hello")
中的代码块提取出来,或者给每个 <div> 块加前缀,光靠 <code><div>.*?</div> 不行。
关键点:
- 必须启用
. matches newline(面板左下角勾选,或按Alt+R后再点一下该选项),否则.永远不跨行 - 优先用
[\s\S]*?而不是(?s).*?:前者 Sublime 兼容性更稳,后者在某些版本里会失效 - 懒惰匹配很重要:
[\s\S]*?匹配到第一个}就停;[\s\S]*会一路吃到文件末尾 - 全局替换时
Where路径必须设对:src/**/*.py才递归搜 Python 文件,只写src/会漏子目录
替换后没保存?这不是 Bug,是设计
Sublime 的 Replace All 只改内存副本,不会自动保存。标签页右上角出现 * 就说明已修改未保存。
必须手动操作:
-
File → Save All,或 - 快捷键:
Ctrl+K后接Ctrl+B(Windows/Linux),Cmd+K后接Cmd+B(macOS)
如果某文件没保存成功,大概率是被 Git、IDE 或系统锁住了 —— Sublime 不报错,只会静默跳过。检查文件权限,或关掉其他正在编辑它的程序。
最易忽略的一点:跨行正则在大文件(>5MB)里容易卡死,尤其带嵌套量词(如 (a+)+)。真要处理大文件,先用 Find All 预览匹配项数量,超过几百条就分批来。











