因为「. matches newline」开关被意外启用,^和$退化为匹配全文起止;需关闭右下角\n图标或按Alt+M,使^/$回归逐行匹配,Windows下建议用\R替代$以避\r残留。

为什么^和$总不匹配行首行尾
因为「. matches newline」开关被意外启用,^和$就退化为全文起止锚点,不再逐行生效。Sublime 默认开启该选项时,^import只能匹配文件第一行的 import,其余行全失效。
必须关闭右下角的 \n 图标(或按 Alt+M 切换),让 ^ 真正表示“本行开头”、$ 表示“本行末尾”。验证方式:输入 ^# → 点 Find All → 若仅高亮每行开头的 #,说明已回归逐行模式。
- Windows 下
$可能停在\r前,导致替换后残留回车;统一用\R更稳 - 若状态栏编码不是
UTF-8,中文场景下^/$可能因乱码失效,先执行File → Save with Encoding → UTF-8 with BOM - 想强制匹配全文起止?用
\A和\Z,不是^和$
捕获组 $1 总是原样输出怎么办
$1 原样输出,90% 是因为三个硬条件没同时满足:查找框里没写带括号的捕获组、.* 图标没点亮、跨文件替换时 Where 路径留空或填了 *。
Sublime 查找时用 \1 引用,替换时必须用 $1 —— 写成 \1 或 ${1} 都会当字面量输出。例如把 func(a, b) 换成 func(b, a),查找写 func\(([^,]+),\s*([^)]+)\),替换必须写 func($2,$1)。
- 所有
(都算编号位,嵌套不影响顺序:((\w+))中$1是整个内层加外层,$2是纯内层 - 不支持命名组
(?P<name>)</name>以外的写法,(?'name')或(?<name>)</name>全无效 - 要输出字面量
$,写成$$;$10无效,只认$1~$9
跨行匹配 .* 为什么总失败
默认情况下 . 不匹配换行符,start.*end 只能在单行生效。强行勾选 . matches newline 后,.* 又容易贪婪吞到文件末尾,尤其遇到嵌套结构(如 {{}})时回溯爆炸、界面卡死。
更稳的写法是显式覆盖换行:(?s)start(.*?)end 或 start([\s\S]*?)end。前者开启 dotall 模式,后者用 [\s\S] 明确表示“任意字符(含换行)”,*? 非贪婪,安全可控。
- 匹配真实换行符本身,用
\R(兼容\r\n、\n、\r),别手输\n(需Ctrl+Enter插入) - 搜
console.log()这类含元字符的字面量,必须转义:console\.log\(\),否则.匹配任意字符,()被当分组语法 - 删空行别用
^\s*$——\s会吞掉换行符,导致 Git 提交异常;改用^[ \t]*$或^[ \t\u3000\xA0]*$(含全角空格)
全局搜索替换为什么 Replace All 没反应
Sublime 的全局替换是「三锁机制」:项目未加载、正则模式未启用、Where 路径未显式限定,缺一不可。点 Replace All in Files 却没变化,大概率是其中一环断了。
检查侧边栏是否有文件树、状态栏左下角是否显示路径 —— 没加载项目就等于没入口。Where 填 ./src/**/*.js 才递归匹配子目录;填 ./src/*.js 只扫一级目录,漏掉 src/utils/ 等路径。
- 排除目录用减号:
-./node_modules -./dist,多个之间空格或换行均可 - 替换后文件名不带星号?Sublime 不自动保存,必须手动
File → Save All或Ctrl+K松开 →Ctrl+B - 卡死或误改?可能是硬读了
package-lock.json、图片等二进制文件;关掉"index_files": false并清缓存目录可救急
真正难搞的不是语法本身,而是边界模糊的场景:比如匹配 HTML 标签对、处理 JSX 中的模板字符串、或在注释和代码混排时精准跳过注释块——这些地方正则容易失焦,该让位给语法解析器或编辑器原生格式化命令。


















