sublime text中^和$默认只匹配全文首尾而非行首行尾,需启用多行模式(勾选↩或加(?m));$在windows下停在\r前,建议用\r;$1需写为$1而非\1;.默认不匹配换行符,跨行应启用.matches newline或用[ss]。

Sublime Text 的正则替换不是“开了.*就能用”,而是必须按场景配开关、选语法、避陷阱——开错一个选项,^就只认全文开头,$1就原样输出,.*就卡死不跨行。
为什么^和$不匹配每行首尾
默认情况下,^只匹配整个文本开头,$只匹配整个文本结尾。比如搜^import,只会高亮文件第一行的 import,其他行全忽略。
- 必须启用多行模式:点击替换面板右下角的 ⇩ 图标(或按
Alt+M),或在正则前加(?m),写成(?m)^import - Windows 下
$会停在\r前,导致替换后残留回车;建议统一用\R(Sublime 内置通用换行符)代替$ - 如果状态栏显示编码不是
UTF-8,中文场景下^/$可能因乱码失效,先执行File → Save with Encoding → UTF-8 with BOM
$1 不生效或输出字面量怎么办
替换框里写 或 都不会展开捕获内容,Sublime 只认 、 这种写法。
- 查找中每一对
(按从左到右顺序编号,嵌套也计入——((\w+))中,外层是$1,内层是$2 - 要输出字面量
$,得写$$;写$会报错或被忽略 - 替换前务必点
Find All,看高亮是否精准圈出目标;再打开Replace Preview(Ctrl+Shift+H)确认$1展开结果
跨行匹配总失败,.* 为什么进不了下一行
. 默认不匹配换行符,这是 Sublime 的硬性限制,不是设置没开对。
- 临时方案:勾选面板右下角的
.图标(. matches newline),但该选项在Ctrl+Shift+F(跨文件搜索)中常失效 - 稳态写法:用
[sS]替代.,例如foo[sS]*?bar—— 显式、跨版本兼容、不依赖全局开关 - 全局搜索必须加
(?s)前缀:(?s)start.*?end,且不能写成(?s:start.*?end)(Sublime 不支持内联修饰符分组) - 提取含换行的引号内容,别用
"[sS]*?",改用"((?:[^"\]|\.)*)",能正确处理转义引号
去重、删空行、提参数这些高频操作怎么不出错
看似简单的需求,一用错正则就漏删、误删、卡死——根本原因是没区分「整行」和「逻辑块」的语义边界。
- 删空行:用
^[ \t]*$,别用^\s*$(\s匹配\n,可能吞掉空行之间的换行符) - 保序去重(如清理 import 列表):先统一换行符为
Unix,再用^(.*$)\n(?=.*^\1$)+. matches newline,大文件卡住时先清空白再试 - 提取括号参数:单层用
\(([^)]+)\),含换行用\{[sS]*?\},嵌套如fn(a, fn(b))不支持递归,须分步或人工校验 - 重命名变量:想把
user_name→userName,用\b([a-z]+)_([a-z])([a-z]*)\b→$1\u$2$3;但__init__无法用负向断言跳过,得人工复查
最易被忽略的一点:所有正则操作前,必须先点 Find All 看高亮范围是否符合预期——哪怕你写了十年正则,在 Sublime 里漏点一个 (?m) 或多打一个 \,结果就全偏了。











