Sublime Text 无法原生实现 re.split() 式保留分隔符的分割,必须用正则捕获组配合替换模拟:如查 ((1).)*),跨行用 \R,引号内分隔符无法自动忽略。;,]+))([;,]?) 替换为 field: $1, sep: $2,空字段需改用 ((?:(?
Sublime Text 本身没有 re.split() 那样的原生“分割后保留分隔符并重组”能力,所有所谓“分割再重组”操作,本质都是靠正则查找 + 捕获组 + 替换逻辑模拟出来的——不是真分割,是用替换把原始结构改写成你想要的格式。
为什么不能直接 split,得靠替换模拟
Sublime 的 split 是编辑器级行为,不暴露数组、索引或中间状态;它只提供“查找→高亮→替换”这一条链路。你想把 "a,b;c" 拆成 ["a", ",", "b", ";", "c"] 再拼成 "a | , | b | ; | c",就必须让正则先识别出“内容+分隔符”的边界,再在替换中显式写出组合逻辑。
- 直接搜
[;,]然后替换成| $0 |,只能得到a | , | b | ; | c,但首尾多出竖线,且无法区分“被切开的位置”和“原始分隔符” - 真正可控的方式是用捕获组:查
([^;,]*)([;,]?),再替换成$1 | $2——但注意,这会把末尾无分隔符的字段(如c)也套上|,需额外处理 - 如果原始字符串含换行或空格干扰,
.默认不跨行,必须勾选.matches newline,否则([^;,]*)在换行处就中断了
用捕获组实现“字段+分隔符”交替提取
目标是把 "name,age;city" 转成 field: name, sep: ,, field: age, sep: ;, field: city 这类带标签的结构,方便人工核对或后续解析。
- 查找模式:
([^;,]+)([;,])?——$1是字段内容,$2是可选分隔符(?很关键,否则末尾字段匹配失败) - 替换为:
field: $1<font color="#888">, sep: </font>$2(<font></font>仅用于视觉区分,不影响逻辑) - 问题:当字段为空(如
",,a"),[^;,]+不匹配空串,会导致漏掉;此时应改用((?:(?![,;]).)*)这种否定字符类+量词组合,但性能下降明显,小文件可用,大文件慎用 - Windows 下换行符是
\r\n,若字段跨行,.不匹配\r,建议统一用\R替代.或显式写[\s\S]
处理引号内分隔符(如 CSV 片段)
真实文本里 "a,b",c 的逗号不能切,但 Sublime 没有环视断言((?)的稳定支持,纯正则硬刚容易翻车。
- 最稳做法:分两步。先用
"([^"]*)"查找所有引号包裹内容,手动加标记(如__QUOTE_START__$1__QUOTE_END__);再按逗号切,最后还原 - 一步到位的弱方案:查
(?:"[^"]*"|[^",\r\n]+),匹配“双引号内容”或“不含引号/逗号/换行的连续非空字符”,但无法处理转义引号("a""b"),也不兼容单引号 - 若文本来自日志或配置片段,且格式固定(如
key="value",flag=true),优先用(\w+)=(?:"([^"]*)"|(\w+))提取键值对,比强行 split 更可靠 - 状态栏编码不是 UTF-8 时,中文引号
“”可能匹配失败,务必先确认编码(File → Save with Encoding → UTF-8)
跨行结构重组时最容易忽略的三个点
比如要把多行 JSON 数组 ["a",\n"b",\n"c"] 改成单行 ["a","b","c"],看着简单,实操常踩坑。
-
.默认不匹配换行符,即使开了 Regex,也必须手动勾选.matches newline(面板右下角图标),否则"([^"]*)"\s*,?在换行处就停住 - Windows 下
$匹配不到\r\n的\n位置,导致替换后残留\r;一律用\R替代$或\n - 替换预览(
Ctrl+Shift+H)看到的$1展开结果,可能和最终效果不一致——因为 Sublime 在批量替换时会动态重算匹配位置,尤其在删除换行符后,后续匹配偏移易错乱;务必先Find All看高亮是否全覆盖,再点Replace All

















