sublime正则截取拼装关键在边界控制、换行处理与单/跨文件区别:需用\r或\r?兼容换行,非贪婪捕获防跨字段,跨文件替换不支持$1,中文空格需显式匹配\u3000等unicode空白。

Sublime 里用正则做字段截取和拼装,关键不是写多复杂的表达式,而是控制匹配边界、避免跨行吞内容、并且分清当前操作是在单文件还是跨文件——后者根本不能用 $1。
为什么 ^ 和 $ 在中文界面下经常不匹配行首行尾
因为 Sublime 默认启用多行模式(Multiline),但不自动识别 Windows 的 \r\n 换行,尤其在中文插件干扰下,^ 可能只匹配整个文档开头,$ 只匹配结尾。粘贴进来的文本若含 BOM 或混合换行符,问题更明显。
- 先按
Ctrl+Shift+P输入Set Syntax: Plain Text,切回纯文本模式,排除语法高亮插件干扰 - 查找框里显式兼容换行:
^#\r?而不是^#;或直接用\R(PCRE 原生支持,跨平台匹配\r\n/\n/\r) - 右下角点击换行符标识(如显示
Windows (CRLF)),手动切为Unix (LF)再试
字段截取必须用捕获组 + 非贪婪 + 边界锚定
想从 name="Alice" age="30" 中只取 Alice 和 30,光写 "([^"]*)" 会跨字段:如果一行有多个引号对,.* 可能一路吃到末尾。
- 用非贪婪:
name="([^"]*)"→$1得到Alice;再补一条age="([^"]*)"→$1得到30 - 加词边界防误触:
\bname="([^"]*)",避免匹配到username="xxx" - 若字段含转义引号(如
desc="He said \"Hi\""),Sublime 的 PCRE 不支持递归匹配,建议先人工清理或换工具;日常场景中,[^"\n\r]*已足够安全
拼装字段时,$1 只在单文件 Replace 面板有效
很多人在 Find in Files(Ctrl+Shift+F)里写 id=(\d+) → user_id: $1,结果所有 $1 都原样输出,没被替换。这不是正则错,是 Sublime 硬限制:跨文件替换不解析捕获组引用。
- 单文件拼装:用
Ctrl+H,勾选.*,查找^(\w+): (\S+)$,替换为"$1": "$2",可批量转成 JSON 键值对 - 跨文件拼装:只能分两步——先
Find All(Alt+Enter),复制所有匹配行 → 新建标签页 → 用单文件替换处理 → 再粘回去 - 想加前缀/后缀?查找
^替换为//;查找$替换为;;注意^和$必须关掉. matches newline,否则失效
中文混排时,\s 根本不认全角空格和不间断空格
\s 只匹配 ASCII 空白( 、\t、\n、\r),对中文全角空格(\u3000)、 (\u00A0)、零宽空格(\u200B)完全无效——这会导致你写的 ^\s*$ 删不掉“看起来是空行”的行。
- 查全角空格:直接复制一个进查找框,或输
\u3000;替换为半角空格 - 批量清理混合空白:用
[ \t\n\r\f\v\u3000\u00A0\u2000-\u200B\u2028\u2029]+替换为单个 - 保留段落空行?把上式改成
[ \t\r\f\v\u3000\u00A0\u2000-\u200B\u2028\u2029]+(?=\S),只清理后面紧跟文字的空白块
真正卡住人的,从来不是 .*? 怎么写,而是你没注意到原始文本里藏了个 \u200B,或者 Find in Files 的 Where 填了 * 却忘了排除 node_modules,又或者——你压根没点那个小小的 .* 图标。











