Sublime Text正则不支持递归匹配,.*?遇首个}即终止,无法匹配嵌套大括号;务实做法是分层匹配或人工处理,同时需用锚点、作用域筛选和路径排除保障安全。

为什么^\s*\.([a-zA-Z0-9_-]+)\s*\{[\s\S]*?\}匹配不到嵌套大括号?
Sublime Text 的正则引擎(PCRE)不支持递归匹配,遇到 { 里再套 { 就会提前终止。比如 .card { .header { color: red; } },默认非贪婪 .*? 会在第一个 } 就停住,导致整个块没被选中。
实操建议:
- 改用原子组 + 负字符集:用
^\s*\.[a-zA-Z0-9_-]+\s*\{(?:[^{}]|(?R))*\}不行——Sublime 不支持(?R) - 务实做法是限制深度:对单层类定义有效,用
^\s*\.[a-zA-Z0-9_-]+\s*\{([^{}]*\{[^{}]*\}[^{}]*)*\},但可读性差、易漏配 - 更可靠的是分两步:先用
^\s*\.[a-zA-Z0-9_-]+\s*\{[^}]*\}匹配无嵌套的类;再人工检查或导出后用脚本处理嵌套情况
如何安全剔除空类或只含注释的类?
直接删 .foo {} 或 .bar {/* no styles */} 很常见,但容易误伤伪类或属性选择器。Sublime 的查找必须加锚点和边界控制。
实操建议:
- 匹配纯空类:
^\s*\.[a-zA-Z0-9_-]+\s*\{\s*\}\s*$—— 注意^和$锁定整行,避免删掉.btn:hover {}里的:hover部分 - 匹配仅含注释的类:
^\s*\.[a-zA-Z0-9_-]+\s*\{\s*/\*[\s\S]*?\*/\s*\}\s*$,需开启.\n模式(点击查找面板右下角.*图标) - 删除前务必勾选
Regex和Match Case(防止把.SVG当成类名),并先用Find All预览所有命中项
批量删类但保留媒体查询内的怎么办?
直接全局删 \.[a-z0-9_-]+\s*\{ 会把 @media (max-width: 768px) { .hidden { display: none; } } 也干掉,破坏响应式逻辑。
实操建议:
- Sublime 不支持“排除某上下文”的正则,只能靠位置规避:先折叠所有
@media块(Ctrl+Shift+[),再对展开区域执行查找替换 - 用作用域筛选:打开命令面板(
Ctrl+Shift+P),输入Set Syntax: CSS确保语法识别正确,然后按Ctrl+Shift+P→Selection: Select by Scope→ 输入source.css meta.at-rule.media可选中媒体查询块,Ctrl+Shift+I反选后操作 - 更稳的方式:把媒体查询块复制到新标签页,删完主文件后再粘回去
Find in Files 跨多文件删类时路径怎么设才不误删?
用 Find in Files(Ctrl+Shift+F)批量处理时,Where 栏填错路径会导致删掉 node_modules 或构建产物。
实操建议:
- 明确限定目录:比如填
./src/**/*.css,./src/**/*.scss,不用./或** - 排除干扰路径:在
Where后加!./node_modules,!.git,!.dist(Sublime 支持!排除) - 别信预览结果:
Find in Files的预览有时不显示换行或缩进差异,务必点开每个匹配文件确认上下文 - 删之前先
Save All,再用File → Revert File快速回退
真正麻烦的不是正则写不对,而是 CSS 里类名可能出现在字符串、JS 注释、甚至 HTML 的 class="foo" 里——Sublime 不区分上下文,全靠你手动核对作用域和文件类型。


















