Sublime中.*不能跨行是因为.默认不匹配换行符,需启用.dotall模式(勾选.*旁\n图标或用(?s).、[\s\S]*);同时^/$会退化为全文锚点,应关闭该选项或加(?m)恢复行级匹配。

为什么 .* 在 Sublime 里跨不了行
因为 . 默认不匹配换行符,这是 PCRE 引擎的硬性限制,不是你正则写错了。哪怕开了 .* 按钮,.* 依然卡在当前行末尾,根本进不去下一行。
- 临时解法:勾选替换面板右下角的
. matches newline(图标是.*旁边带\n的那个),但该选项在Ctrl+Shift+F跨文件搜索中大概率失效 - 更稳写法:用
[\s\S]或(?s).替代.*,前者明确表示“所有字符”,后者启用 dotall 模式 - 注意:
(?s)只影响它后面的.,不影响字符类如[^)],所以(?s)console.log([^)]*)仍可能被换行截断;得改成(?s)console.log((.*?))并人工确认闭合边界
^ 和 $ 总是只匹配全文头尾,不按行生效
这不是 bug,是 Sublime 启用 . matches newline 后的副作用:一旦点开那个 \n 图标,^ 和 $ 就退化为全文锚点,不再逐行工作。
- 正确做法:关掉
. matches newline(点一下那个\n图标让它变灰),再确保.*按钮已点亮,此时^#.*$才能准确删掉每行开头的注释 - 或显式加
(?m)开启多行模式:(?m)^import,这样即使. matches newline开着也不影响^/$行级行为 - Windows 下
$会停在\r前,导致替换后残留回车;建议统一用\R(Sublime 内置通用换行符)代替$
$1 不展开,反而原样输出字面量
Sublime 替换语法只认 $1、$2,不支持 \1 或 。写错就直接当普通文本输出,毫无提示。
- 查找时用
(\w+): (\d+),替换必须写$1 = $2,不能写= - 要输出字面量
$,得写$$;单独写$会被忽略或报错 - 捕获组编号严格按左括号顺序,嵌套也算:
((\w+))中外层是$1,内层是$2 - 替换前务必先点
Find All,看高亮是否精准圈出目标;再开Replace Preview(Ctrl+Shift+H)确认$1展开结果
中文界面 + Windows 换行符引发的连锁失效
中文插件有时会干扰行结束符解析,加上 \r\n 混合存在,会导致 ^、$、. 全面失灵——尤其从网页或 Excel 粘贴过来的文本。
- 先切回纯文本模式:
Ctrl+Shift+P→ 输入Set Syntax: Plain Text,排除语法高亮插件干扰 - 状态栏右下角查看换行格式,点击切换为
Unix (LF);若需保留 CRLF,查找时显式写\r?,比如把^#\r?当作行首锚点 - 编码非
UTF-8时中文匹配常失败:执行File → Save with Encoding → UTF-8 with BOM - 别依赖
.*强撑跨行,大文件里[\s\S]*?易卡顿;优先考虑先用 Prettier 等工具格式化成单行,再用稳定正则处理
实际操作中最容易被忽略的是:. matches newline 和 ^/$ 行行为互斥,开一个就得关另一个,没有中间态。多数人反复试错,其实就卡在这个开关组合上。

















