Sublime中^和$默认只匹配全文首尾,需启用多行模式(勾选⇌或加(?m))才逐行生效;$1需写为$1且正则开关必须激活;.*不跨行须用[sS]或(?s);中文匹配失败应转UTF-8 with BOM。

Sublime 的正则替换不是“开了.*就能用”,而是必须按场景配开关、选语法、避陷阱——开错一个选项,^就只认全文开头,$1就原样输出,.*就卡死不跨行。
为什么^和$只匹配全文首尾,不匹配每行
默认情况下,^只锚定整个文本开头,$只锚定整个文本结尾。比如搜^import,只会高亮文件第一行的 import,其他行全忽略。
- 必须启用多行模式:点击替换面板右下角的 ⇩ 图标(或按
Alt+M),或在正则前加(?m),写成(?m)^import - Windows 下
$会停在前,导致替换后残留回车;建议统一用R(Sublime 内置通用换行符)代替$ - 状态栏显示编码不是 UTF-8 时,中文场景下
^/$可能因乱码失效,先执行File → Save with Encoding → UTF-8 with BOM
$1不展开、输出字面量或报错怎么办
替换框里写 或 \1 都不会展开捕获内容,Sublime 只认 $1、$2 这种写法。
- 查找中每一对
()按从左到右顺序编号,嵌套也计入——例如((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]*?",改用"((?:[^"]|.)*)",能正确处理转义引号
删空行、去重、提参数这些高频操作怎么不出错
看似简单的需求,一用错正则就漏删、误删、卡死——根本原因是没区分「整行」和「逻辑块」的语义边界。
- 删空行:用
^[ ]*$,别用^s*$(s匹配,可能吞掉空行之间的换行符) - 保序去重(如清理
import列表):先统一换行符为 Unix(Ctrl+Shift+P→Set Line Endings: Unix),再用^(.*$) (?=.*^$)+. matches newline;大文件卡住时先清空白再试 - 提取括号参数:单层用
(([^)]+)),含换行用{[sS]*?},嵌套如fn(a, fn(b))不支持递归,须分步或人工校验
最常被忽略的其实是作用域控制:跨文件替换时 Replace in Files 面板不支持 $1 引用,只有当前文件的 Replace 面板才认;而 Find in Files 结果页复制出来的是带路径前缀的原始行,需额外清洗。这些细节不提前踩一遍,导出的数据看着整齐,实际埋着格式错位或字段截断的坑。











