sublime在vue项目中正则可用但需规避sfc结构陷阱:必须启用“. matches newline”、分块处理template/script、用[\s\s]*?替代.*?、加锚点防误匹配、避免跨语法域操作。

Sublime 的正则在 Vue 项目里不是不能用,而是必须绕开模板解析盲区、避开 SFC 结构陷阱、且所有跨行操作都得手动开开关——否则 v-if 里的括号会吞掉整个 <script></script> 块。
为什么 v-bind:xxx="foo()" 总匹配不全
Vue 单文件组件(SFC)里属性值常跨多行或嵌套,.*? 在默认设置下根本进不了下一行。Sublime 的 . 默认不匹配换行符,哪怕你写了 v-bind:[^\r\n]*?,遇到换行就停住。
- 必须勾选面板右下角的
.图标(. matches newline),或在正则前加(?s),例如:(?s)v-bind:[^>]*? - 更稳写法是放弃
.,改用[^>]*或[\s\S]*?:前者防吞标签闭合,后者兼容所有空白和换行 - 注意
<template></template>和<script></script>是不同语法域,一个正则无法安全横跨——先用<template>[\s\S]*?</template>提取模板块,再单独处理
ref="xxx" 批量转 ref="xxxRef" 容易误改 ref="xxxInput"
直接搜 ref="(\w+)" 替换为 ref="Ref" 看似合理,但会把 ref="userInput" 变成 ref="userInputRef",破坏语义。
- 用单词边界不够:Sublime 的
\b把_和数字当单词字符,\bxxx\b对xxxInput无效 - 稳妥做法是加明确上下文锚点:
ref="([^"\s]+)"(?=\s*[/>])—— 要求引号后紧跟空格、/或>,排除中间插入其他属性的情况 - 替换前务必点
Find All,确认没命中ref="xxxInput" :class="..."这类复合场景
删空行时 ^\s*$ 让 和 紧贴在一起
Vue 文件末尾常有空行分隔逻辑块,用 ^\s*$ 删除会吞掉 \n\n 中间的换行,导致保存后格式错乱、Prettier 报错。
-
\s包含\n和\r,这是 Boost.Regex 引擎行为,不是 bug - 正确写法是
^[ \t]*$:只匹配空格和 Tab,放过换行符,保留块间结构 - 若需清理含全角空格的“伪空行”,扩展为
^[ \t\u3000\xA0]*$,但要先确认文件编码是 UTF-8(状态栏看 Encoding)
提取 <script setup></script> 里 defineProps 参数总漏掉换行内容
defineProps({ 后面常换行、缩进、注释,\(([^)]+)\) 会卡在第一行右括号就结束,漏掉后续字段。
- 别用
.*?,它在跨行时极易越界匹配到下一个};改用\{[\s\S]*?\},显式限定大括号范围 - 如果 props 里有嵌套对象(如
config: { a: String }),Sublime 不支持递归正则,\{[\s\S]*?\}仍可能提前闭合——此时应分两步:先提最外层defineProps\(([\s\S]*?)\),再人工校验或用插件 - 执行前关闭
Highlight matches(大文件易卡),并确保. matches newline已启用
真正难处理的从来不是正则语法,而是 Vue SFC 的混合结构:同一文件里 HTML 模板、JS 逻辑、CSS 样式共存,而 Sublime 的正则没有语法感知能力。每次跨块操作前,先用 <template>[\s\S]*?</template> 或 <script>]*>[\s\S]*?</script> 切出子域,比硬写一个“全能正则”靠谱得多。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











