Sublime中^和$默认匹配全文起止而非每行首尾,因PCRE默认启用“. matches newline”导致多行模式语义退化;需关闭跨行匹配或添加(?m)修饰符才能实现逐行匹配。

Sublime 的 ^ 和 $ 默认不匹配每行首尾,而是整个文档的开头和结尾——这不是 bug,是 PCRE 引擎在默认配置下的行为。想让它们真正按“行”工作,必须手动干预开关或修饰符。
为什么 ^ 和 $ 总是只匹配全文起止?
根本原因是 Sublime 默认启用 . matches newline(即点号跨行),此时多行模式下 ^/$ 语义退化。即使你勾选了 .* 按钮,只要旁边还亮着 \n 图标,^ 就不会识别换行后的行首。
- 验证方法:搜
^import,如果只有第一行高亮,说明没生效 - Windows 下更隐蔽:换行符是
\r\n,$会停在\r前,导致看似“匹配失败” - 中文界面插件可能干扰行结束符识别,尤其从网页粘贴文本后
正确启用逐行匹配的两种等效方式
必须同时满足两个条件:正则模式开启 + 跨行匹配关闭。任一缺失都会让 ^/$ 失效。
- 点击替换面板右下角
.*按钮(确保高亮),再点击它旁边的\n图标把它关掉(图标变灰) - 快捷键更可靠:Windows/Linux 按
Alt+R,macOS 按Cmd+Alt+R,可强制切换并重置跨行状态 - 或者在正则开头加
(?m)修饰符,如(?m)^#.*$—— 这种写法不依赖界面状态,适合复用搜索历史
Windows 下 $ 匹配不到行尾的绕过方案
当文件是 CRLF 换行且无法切换为 LF 时,$ 容易漏掉 \r 后面的内容。直接用 \R 替代 $ 是 Sublime 内置的通用换行符匹配,兼容所有平台。
- 删注释行:查找
(?m)^#.*\R,替换为空 —— 比^#.*$更稳 - 行尾加字符:查找
\R,替换为;\R,避免在\r和\n之间插入错位 - 不要用
\r?手动兼容:它在 Unix 文件里会多匹配一个空字符,反而污染结果
批量处理空行或伪空行的精准写法
用 ^\s*$ 删空行是唯一跨平台安全的方案,但前提是关闭 . matches newline,否则 \s 会吞掉换行符导致整段被误删。
-
^\s*$覆盖空格、\t、\r、\n、全角空格\u3000、不间断空格\u00a0 - 别用
^$:它跳过所有带空格或 Tab 的“伪空行”,比如(4个空格)完全不匹配 - 别用
^\s*\n:在 Windows 下会把\r\n拆成两行,导致替换后出现异常粘连
最易忽略的点:正则是否生效,和你在哪个面板操作强相关——Ctrl+F 查找面板里的 .* 开关,和 Ctrl+H 替换面板里的不是同一个状态。调试时务必确认当前面板右下角图标组合是否一致。

















