^(?!.关键词).$是唯一靠谱写法,因sublime引擎依赖负向前瞻断言+行锚定实现稳定反向匹配,需开启正则、关闭.*匹配换行符,否则跨行误匹配或完全失效。

直接结论:用 ^(?!.*关键词).*\$,必须开启正则模式、关闭 . matches newline,否则会跨行误匹配或完全失效。
为什么 ^(?!.*关键词).*\$ 是唯一靠谱的写法
这个表达式不是“看起来高级”,而是 Sublime 正则引擎在行模式下唯一能稳定实现“整行不包含某串”的方案。它靠负向前瞻断言 (?!.*关键词) 在每行开头做一次检查:如果该行任意位置出现关键词,整个匹配就失败,这行就不会被选中。
-
^和$锚定在行首/行尾,确保只作用于单行(前提是没开. matches newline) -
.*关键词中的.*默认不跨换行,所以不会“偷看”下一行内容 - 别用
^[^关键词]*\$这类写法——它只防关键词的“单个字符”,target会被当成t、a、r分开否定,毫无意义 - Sublime 不支持
(?s)或/s标志,所以不能靠修饰符开启单行模式,必须依赖默认行为
实际替换时怎么填“查找”和“替换”框
目标是删除所有不包含 error 的行,只留下含 error 的日志行:
- 打开
Ctrl + H(Windows/Linux)或Cmd + Option + F(macOS) - 点击右上角
.*按钮启用正则模式 - 确认
. matches newline未勾选(这是关键!勾选后^和$失效,整段变一行) -
Find What填:^(?!.*error).*\$ -
Replace With留空 - 点
Replace All—— 剩下的就是你要的error行
注意:Windows 文件换行是 \r\n,但 $ 在 Sublime 中自动兼容所有换行类型,不用额外写 \r?\n。
容易踩的三个坑
这三个问题占了 90% 的失败案例:
- 误开
. matches newline:一开,.*就吞掉换行符,^(?!.*error).*$可能从第一行开头一直吃到最后一行结尾,整文件只剩一行,且^/$完全失效 - 关键词里有正则元字符:比如想排除
foo.bar,直接写^(?!.*foo.bar).*\$会把fooXbar也放行。得转义:^(?!.*foo\.bar).*\$ - 大小写敏感:Sublime 默认区分大小写。要忽略大小写,不能加
i标志(不支持),得手动改写成^(?!.*[eE][rR][rR][oO][rR]).*\$,或者先用Alt + C关闭大小写匹配(更简单)
删完发现空行还在?那是另一个问题
^(?!.*关键词).*\$ 匹配的是“非关键词行”,但它本身不识别空行——如果某空行也不含关键词,它也会被删掉;但如果你发现删完后还剩一堆空行,说明它们是“含关键词的行”之间的间隔,没被这个正则覆盖。这时候要单独再跑一遍 ^\s*\$ 清理空行。记住:这两个操作不能合并,因为逻辑不同,强行塞进一个正则只会让事情更不可控。











