推荐使用正则[a-zA-Z0-9.\_%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}匹配邮箱,覆盖常见变体,排除非法组合与伪域名,适配Sublime的PCRE引擎且不依赖^$锚点。

正则表达式怎么写才能准确匹配邮箱
邮箱格式看似简单,但实际变体多:带子域名的(user@sub.example.com)、含加号别名的(test+spam@gmail.com)、甚至带引号的本地部分("john..doe"@example.org)。Sublime 的 PCRE 引擎不支持完整的 RFC 5322 邮箱校验,所以得在「够用」和「不过度误杀」之间找平衡。
推荐用这个模式:[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}
- 开头
[a-zA-Z0-9._%+-]+覆盖常见本地部分字符,排除空格和双点(..)这类明显非法组合 -
@后面要求至少一个点(\.),防止把user@localhost这类非真实邮箱也抓出来 - 顶级域限制为
[a-zA-Z]{2,},排除单字母或纯数字后缀(如.123) - 不加
^和$锚点——因为你要从大段文本中提取,不是整行校验
Sublime 中开启正则替换的具体操作步骤
别直接按 Ctrl+H 就开干。漏掉关键开关会导致正则当普通字符串处理,怎么写都匹配不上。
- 先确保右下角显示
Regular Expression(图标是.*),没亮就点一下它激活 - 在「Find」框粘贴上面的正则:
[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,} - 「Replace」框填
$0(提取全部匹配)或$1(如果用了捕获组) - 想批量提取到新文件?先
Find All,再Ctrl+C复制所有高亮结果,粘贴到新 tab 即可
为什么有时会漏掉某些邮箱或匹配出奇怪内容
常见失准不是正则写错了,而是上下文干扰或 Sublime 的默认行为:
- 文本里有 HTML 标签(比如
<a href="mailto:test@example.com">),正则可能跨标签匹配,建议先用<[^>]*>清理标签再跑邮箱 - 邮箱被换行符断开(
user@exa\nmple.com),默认不跨行匹配;需勾选Match Across Lines(搜索面板右上角...菜单里) - 中文混排文本中,全角 @(@)或点(.)会被忽略——正则里的
@和\.只匹配半角,得手动加上@和.替代选项(但通常建议先统一转为半角) - Sublime 对 Unicode 支持有限,像
用户@例子.中国这种中文域名不会被[a-zA-Z]匹配到,得换成\p{L}(需开启 PCRE2 模式,但 Sublime Text 4 以下不支持)
提取后去重和导出的小技巧
正则只管“找”,后续清洗得靠 Sublime 自身功能或简单命令行辅助:
- 选中所有匹配结果 →
Ctrl+Shift+P→ 输入Sort Lines→ 回车,自动排序 - 再执行一次
Ctrl+Shift+P→Remove Duplicate Lines,注意它只删相邻重复行,所以必须先排序 - 想导出为 CSV?在「Replace」框填
$0,,然后全部替换,最后删掉末尾多余的逗号 - 如果数据量大(>10 万行),Sublime 可能卡顿,不如复制到终端用
grep -oE '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}' file.txt | sort -u
真正麻烦的不是写出正则,而是识别哪些邮箱是测试用的、哪些带无效域名、哪些根本没人维护——这些得靠后续验证,正则解决不了。

















