根本原因是未启用正则引擎:必须点击右下角 .* 图标(或按 alt+r)才能使 \d、^、$ 等生效,否则全作字面字符处理;关闭 . matches newline 后用 [\s\s]? 替代 . 可跨行且防贪婪。

为什么写了正则却一条都匹配不上
根本原因就一个:没点右下角的 .* 图标。Sublime 默认关闭正则引擎,\d、^、$ 全当普通字符处理,连 . 都不表示“任意字符”。哪怕你写了 console\.log\([^)]*\),只要 .* 没亮蓝,就等于白写。
必须手动点击它(或按 Alt+R),再验证是否生效:输入 \d+ 点 Find,能高亮数字才算成功。别信“我肯定开了”,90% 的失败源于这一步漏操作。
非结构化数据里提取字段总跨行/吞错内容
非结构化文本(如日志、爬虫原始输出、邮件正文)常换行随意、缩进混乱,.* 默认不匹配换行符,start.*end 一跨行就失效;而盲目开 . matches newline 又容易贪婪吃到文件末尾。
- 稳妥做法:关闭
. matches newline,改用[\s\S]*?或[^"]*?这类显式否定字符类,既覆盖换行又防贪婪 - 想匹配“以 ERROR 开头、到下一个空行结束”的块?用
ERROR[\s\S]*?(?=\R\R|$),\R是 Sublime 内置的跨平台换行符,比\r?\n可靠 - 避免用
.*开头——它会强制引擎扫描整行甚至全文,大文件直接卡死
替换后格式错乱、JSON 被破坏、缩进丢失
问题不在正则本身,而在捕获和引用方式不对。比如想把 key: value 改成 "key": "value",若写成 (\w+):\s*(\S+) → "$1": "$2",看似合理,但实际会崩:
-
\S+会吞掉引号、逗号甚至换行,$2引用的内容远超预期 - 正确做法:用
(\w+)\s*:\s*("([^"]*)"|'([^']*)'|(\S+))分情况捕获,再用$1、$3、$4、$5分支处理 - 缩进保留靠
^(\s*)捕获开头空白,替换时用$1"$2": "$3",否则所有行全顶到左边界 - 永远先点
Find All看高亮范围,再开Replace Preview(Ctrl+Shift+H)确认每处替换结果
跨文件批量替换时漏文件或报错
Ctrl+H 只作用于当前文件;真要扫整个项目,必须用 Ctrl+Shift+F 打开 “Find in Files”,否则永远找不到 ./src/**/*.js 里的内容。
- 在
Where栏填路径时,别写相对路径如src,要写./src或绝对路径,否则可能跳过子目录 - “Replace All” 灰掉?检查两点:替换框是否为空、当前文件是否只读(右下角显示
RO) - 含中文、emoji 的非结构化数据,别依赖
\w——它不匹配中文,直接用字面量或[\u4e00-\u9fa5] - 嵌套结构(如多层
{}、HTML 标签)别硬刚正则,Sublime 不支持平衡组,该上jq或BeautifulSoup就别拖
真正卡住人的不是语法多难,而是非结构化数据没有统一边界,^ 和 $ 默认不按行工作、\R 和 \s 行为差异、捕获组编号按左括号顺序算——这些细节不踩一遍坑,很难信。











