首先,我们来分析一下这个标题:**《文本挖掘利器:在表达式中使用 Regex 正则提取邮件、手机号与订单编号》**。
这是一个非常典型的**实操型**标题。关键词是“使用”、“提取”,说明读者是想动手干活的,他们想知道具体的步骤和方法。虽然它涉及到了 Regex 这个概念,但目的不是为了科普 Regex 是什么,而是为了在 n8n 的特定环境(表达式)中去用好它。
因此,**模式 A** 是最贴切的选择。我将把重点放在“怎么做”上,手把手教你如何在 n8n 的表达式编辑器里写正则,解决实际的数据清洗痛点。
---
还在手动复制粘贴?n8n+Regex 让你一劳永逸
笔者在做自动化项目时,最头疼的不是复杂的 API 调用,而是处理那些乱七八糟的文本。客户发来的消息、系统导出的日志、甚至是微信里的订单截图,信息总是混杂在一起。

比如一段文本里既有“订单号:NO20240520”,又有“联系人:13800138000”,还有邮箱“support@n8ndx.com”。如果靠人工去扒,不仅眼瞎,效率还极低。
这就是典型的“非结构化数据”痛点。好消息是,在 n8n 这种低代码神器里,配合**正则(Regex)**这个核武器,我们可以在表达式里瞬间完成数据提取。今天,N8N大学就带你彻底搞定这个技能。
准备工作:你需要什么?
这事儿门槛极低,你不需要懂高深的编程:
- 一个 n8n 环境:官方云服务或自己部署的都行。
- 一个触发节点:比如
Webhook或者Manual Trigger。 - 一段脏数据:用来测试我们的正则是否生效。
核心实操:三步搞定正则提取
在 n8n 的表达式中使用 Regex,其实就是在 JavaScript 的字符串处理函数外包了一层壳。我们不需要写复杂的 Node.js 脚本节点,直接在 Set 节点或者后续节点的输入框里就能搞定。
步骤 1:准备测试数据(模拟场景)
为了让教程更硬核,我们先在 Set 节点里构造一段杂乱无章的文本。假设这是你收到的一条客服消息:
用户反馈:订单号 A20245566 无法支付,我的手机是 186-1234-5678,邮箱是 test.user@example.com,请尽快处理。
在 n8n 中,我们将这段文本赋值给一个变量,比如 raw_text。
步骤 2:在表达式编辑器里写 Regex
这是重点。n8n 的表达式编辑器支持 JavaScript 的 .match() 和 .replace() 方法。我们主要用 .match() 配合正则来抓取。
1. 提取手机号(最易出错)
手机号的规则很明确:1开头,第二位通常是3-9,后面跟9个数字。注意,输入框里的连字符(-)要处理。
在目标节点的输入框中,输入以下表达式(注意双引号):
{{ $json.raw_text.match(/1[3-9]d{9}/)[0] }}
解析: 1[3-9] 匹配首位和第二位,d{9} 匹配后续9位数字。注意最后的 [0],这是为了提取匹配到的结果本身。
2. 提取邮件地址
邮件的规则稍微复杂,但在 n8n 里我们可以用通用的正则写法:
{{ $json.raw_text.match(/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}/)[0] }}
解析: 这段正则虽然长,但逻辑很清晰:找“用户名@域名.后缀”这种结构。
3. 提取订单编号(混合字母数字)
假设订单号是 "A20245566",规则是首字母大写,后面跟数字。为了更通用,我们可以提取连续的字母加数字组合:
{{ $json.raw_text.match(/[A-Z]d{6,}/)[0] }}
解析: [A-Z] 匹配大写字母,d{6,} 匹配至少6位数字(防止误触)。
步骤 3:使用 Split 或 Replace 进阶处理
有时候你不想用 Regex 抓取,只想把无关字符删掉。n8n 表达式也支持 .replace()。
比如你想把手机号中间四位变成星号:
{{ $json.raw_text.match(/1[3-9]d{9}/)[0].replace(/(d{3})d{4}(d{4})/, '$1****$2') }}
这在做数据脱敏时非常有用。
避坑指南:Regex 和 n8n 的“爱恨情仇”
笔者在实战中踩过不少坑,这里分享两个最容易导致 workflow 跑不通的细节:
1. 没有匹配到内容时的空指针
如果你的文本里根本没有手机号,那么 .match() 会返回 null。此时如果你后面还跟着 [0],n8n 就会报错 Cannot read property '0' of null。
解决方案: 使用三元运算符做个保底判断。
{{ $json.raw_text.match(/1[3-9]d{9}/) ? $json.raw_text.match(/1[3-9]d{9}/)[0] : '未找到' }}
2. 忽略了大小写和全局匹配
虽然在 .match() 中默认提取第一个,但如果你处理的是多行文本,或者邮箱大小写混用,建议在正则末尾加上 i(忽略大小写)。
虽然在 n8n 表达式中通常不需要显式写全局标志(因为我们只取第一个),但了解正则的基础语法能让你少走弯路。
FAQ 问答
Q1: n8n 里有没有现成的 Regex 模板可以直接用?
A: n8n 本身没有内置“Regex 模板库”,但 N8N大学 建议大家自建一个 Snippet(代码片段)库。常用的正则(如手机号、身份证、IP地址)写好后保存下来,下次直接复制粘贴到表达式里即可。
Q2: Regex 表达式太长了,有没有可视化的调试工具?
A: 强烈推荐使用 Regex101.com。在把表达式丢进 n8n 之前,先在网站上粘贴你的测试文本,调试通了再放进去,能节省大量试错时间。
Q3: 如果文本中有多个手机号,怎么一次性全部提取出来?
A: 在 n8n 的表达式里,如果想提取所有匹配项,可以使用 matchAll。例如:{{ $json.raw_text.match(/1[3-9]d{9}/g) }}。注意这里加了 g 标志,返回的是一个数组,你可以配合 Split 节点或者 JS 节点进行遍历处理。
总结与资源
Regex 是文本挖掘的手术刀,而 n8n 是让它变得平民化的操作台。掌握了在 n8n 表达式中使用 Regex,你就拥有了处理任何非结构化数据的能力。
N8N大学 推荐资源:
- 正则速查表: 搜索 "Regex Cheat Sheet" 保存一份在书签栏。
- 实战案例: 访问 n8ndx.com,搜索“数据清洗”查看更多工作流模版。
我是 N8N大学 的首席主编,希望这篇硬核教程能帮你解决实际问题。下次遇到乱码,别再手动复制了,打开 n8n,写一行正则吧。