Sublime Text中^和$默认按行匹配,非文件首尾;跨行需用\A和\z;Tab分隔CSV生成INSERT应使用^([^\t]+)\t([^\t]+)\t([^\t]+)$替换为INSERT INTO users (name, email, status) VALUES ('\1', '\2', '\3');注意空列、单引号转义及隐藏字符。

匹配原始数据行时,为什么 ^ 和 $ 不生效?
Sublime Text 的正则引擎默认按「行内模式」工作,^ 和 $ 匹配的是每行的开头和结尾,不是整个文件。但如果你粘贴的数据含换行符(比如从 Excel 复制带换行的单元格),或用了 Windows 换行(\r\n),就可能让 $ 在意料外的位置停住。
- 确保数据是纯文本、无隐藏段落符:用
Ctrl+Shift+P→Convert Line Endings: Unix - 需要跨行匹配字段?改用
\A(文件开头)和\z(文件结尾),但批量生成 INSERT 一般不需要 - 更稳妥的做法是先用
^\s<em>(.+?)\s</em>$捕获每行非空内容,再处理字段分隔
用 Tab 分隔的 CSV 行,怎么写替换正则生成 INSERT INTO?
假设你有三列:用户名、邮箱、状态,用 Tab 分隔,目标是生成 INSERT INTO users (name, email, status) VALUES ('xxx', 'yyy', 'zzz');
- 查找:
^([^\t]+)\t([^\t]+)\t([^\t]+)$ - 替换:
INSERT INTO users (name, email, status) VALUES ('\1', '\2', '\3');
注意点:
-
[^\t]+比.+安全,避免跨列吞掉 Tab - 如果某列可能为空,改用
([^\t]*),否则空列会导致整行不匹配 - 单引号需转义?不用 — Sublime 替换中单引号就是字面量,直接写
'\1'即可 - 若字段含单引号(如 O'Connor),得额外处理:先全局把
'替成'',再套 SQL 模板
中文或特殊字符插入失败,是不是编码或转义问题?
不是。Sublime 的正则替换本身不修改字符编码,它只是字符串搬运工。SQL 插入失败通常出在:
- 数据库连接未设 UTF8:MySQL 要
SET NAMES utf8mb4,PostgreSQL 要确保 client_encoding 是UTF8 - 替换结果里混入了不可见字符:比如从网页复制来的全角空格、零宽空格(
\u200b),可用[[:space:]]或\s在查找中暴露它们 - 中文字段没加引号:确认替换模板里字段值始终包在单引号内,例如
'\1',而不是\1 - MySQL 严格模式下,空字符串插入
NOT NULL字段会报错 — 这和正则无关,得检查源数据或改表结构
一次处理几百行后,发现部分语句漏了分号或括号错位
这是典型「贪婪匹配 + 字段含逗号/括号」导致的捕获偏移。例如一行是 张三\t"admin,user"\tactive,而你用 ,+ 或 .+ 做分隔逻辑,引号内的逗号就会破坏分组。
- 解决办法:别依赖逗号,回归真实分隔符(Tab / 竖线 / 固定宽度)
- 如果必须处理带引号的 CSV,Sublime 正则能力有限,建议先导出为标准 CSV,用 Python 或
csvsql生成 INSERT - 更快的自查方式:替换完后,用查找
VALUES ([^)]*?检查是否所有VALUES后都有左括号,再查;$看行尾分号是否齐全 - 记住:正则不是解析器。它适合结构干净的数据;一旦字段本身含分隔符、换行、引号嵌套,就该换工具
真正卡住的地方,往往不是不会写 \1,而是没意识到原始数据里那个看不见的 \r 或 Excel 自动加的双引号。

















