Sublime正则替换需先开启.*模式,否则元字符无效;跨行需(?m)或↩图标;捕获组引用仅支持$1;换行统一用\R;空行删除用^[ \t]*$\R?;验证查找再替换可提升效率。

Sublime 的正则替换不是“写了就能用”,.* 按下没反应、$1 变成字面量、空行删不干净——这些问题 90% 都出在模式没开对、元字符没转义、或跨行逻辑错配。
必须先点右下角 .* 图标,否则所有正则都当普通文本处理
按 Ctrl+H(Windows/Linux)或 Cmd+H(macOS)呼出替换面板后,右下角图标显示 AB 就是纯文本模式,.* 才是正则生效状态。常见误操作:
- 写了
console\.log\([^)]*\)却搜不到任何内容——其实是.*没点开,.和(全被当字面字符 - 想匹配
user_id却用了\buser\b,结果命中username——这不是写错了,是 Sublime 的\b把下划线_当作单词字符,得改用(? - macOS 上旧版本(如 3176 前)对
\U/\L支持不稳,大小写转换异常时建议升级或换插件
^ 和 $ 默认只匹配全文首尾,多行场景必须开 ↩ 或加 (?m)
比如搜 ^import,不开多行模式就只高亮文件第一行;Windows 下 $ 还会停在 \r 前,导致替换后残留回车。正确做法:
- 点击替换面板右下角
↩图标(或按Alt+M),或在正则开头显式写(?m)^import - 跨平台换行统一用
\R,别用\r?\n或$ - 状态栏编码不是
UTF-8时,中文场景下^/$可能因乱码失效,先执行File → Save with Encoding → UTF-8 with BOM
替换里必须用 $1,\1 或 ${1} 全部原样输出
捕获组编号严格按左括号顺序从左到右计数,嵌套也计入。容易踩的坑:
- 查找
url("([^"]*)"),替换写成background-image: url("/static/\1")是错的——Sublime 替换栏只认$1,写\1会直接输出字面\1 - 想输出字面
$?得写$$;写$会报错或被忽略 - 嵌套括号如
((\w+))中,$1是整个匹配,$2是内层内容;非捕获组(?:...)不占编号 - 用
\K重置匹配起点时,前面内容不进捕获结果,$1无法引用它——适合“找前缀但不替换”的场景,例如log\.info\(\K.*?(?=\))
跨行匹配不能靠 .*,要用 (?s) 或 [sS]
. 默认不匹配换行符,这是硬限制。勾选 . matches newline 在 Ctrl+Shift+F(跨文件搜索)中常失效,更稳的写法:
- 全局跨行:在正则开头加
(?s),例如(?s)start(.*?)end,注意不能写成(?s:start.*?end)(Sublime 不支持内联修饰符分组) - 局部跨行:用
[sS]替代.,例如foo[sS]*?bar,显式、跨版本兼容 - 提取含转义引号的字符串:别用
"[sS]*?",改用"((?:[^"\]|\.)*)",能正确跳过"\"" - 删空行别用
^\s*$——\s匹配\n,可能吞掉换行符破坏结构;应关掉. matches newline,用^[ \t]*$\R?替换为空
真正麻烦的从来不是怎么写正则,而是 Sublime 对换行、引用、引擎模式的隐式约束——每次替换前花 10 秒用 Ctrl+F 单独验证查找是否真能命中目标文本,比事后调试快十倍。

















