正则反推实战:给几个例子,自动生成正则,不用从零背语法
不想从头记正则语法,又要从一堆数据里提字段。这篇讲怎么用例子反推正则:粘正例反例自动出多个候选,再拿测试器验证,日期、SKU、日志都能快速搞定。
正则反推实战:给几个例子,自动生成正则,不用从零背语法
写正则这件事,卡住大多数人的不是逻辑,是语法。\d、{2,3}、[A-Za-z]、锚定符、量词,这些符号平时不写就忘,真要从一堆数据里抠出某个字段时,常常是打开文档翻半小时,再对着字符串一位一位数。
其实有一条更省事的路:别从语法出发,从例子出发。手里既然已经有几条想匹配的字符串,直接把它们交给工具,让工具反过来推出正则。这就是 正则反推 在做的事。
反推和测试,是两个相反的方向
平时大家熟悉的是正向:写好一个正则,丢进 正则测试 看它命中哪些串。反推是反过来,先有串,后有正则。
具体做法很直接:把"希望匹配"的字符串当正例粘进去,再把"不该匹配"的当反例粘进去。工具按列对齐这些正例,找出哪些位置是固定字符、哪些位置是可变字段,然后生成 3 到 5 个候选正则,按"最紧到最松"排好序。每个候选都会拿你的反例跑一遍,凡是命中了反例的,直接剔掉。
这套流程的好处是:你不需要知道 \d+ 怎么写,只需要知道哪几条该中、哪几条不该中。语法的事交给工具。
工具是怎么从样本归纳出字符类的
理解它怎么工作,用起来才放心。核心是两步。
第一步是 token 分类。工具把每个字符归到一类:字母、数字、空白、标点、Unicode 文字(CJK 这种和 ASCII 字母分开算)。所以 张三12 不会被粗暴地塌成 .+,而是识别成"中文字 + 数字"两段。
第二步是列对齐找骨架。把所有正例竖着排,逐列看:这一列在每条正例里都是同一个字符,就当成固定字符照抄;这一列字符在变但类型一致,就替换成对应的字符类。比如三条正例第 1 到 2 位都是大写字母,工具就推出 [A-Z]{2};接下来三位都是数字,就是 \d{3}。
候选为什么有好几个?因为没有唯一答案。AB123 和 CD456 可以是 [A-Z]{2}\d{3}(最紧,正好两字母三数字),也可以是 [A-Z]+\d+(中等),还可以是 \S+(最松)。哪个对取决于你下游怎么用,所以工具把它们都列出来,标上每个候选在正反例上的命中率,你自己挑。
一个真实例子:从几个日期样本生成日期正则
说再多不如跑一遍。假设我要从一批文本里抓出所有 ISO 日期,手里有这几条样本:
2026-05-27
2026-12-01
1999-01-31
把这三条当正例粘进去。再贴两条反例,告诉工具什么不能要:
2026/05/27
27-05-2026
点"推断",最紧的候选回来是:
\d{4}-\d{2}-\d{2}
它精确命中三条正例:四位年、连字符、两位月、连字符、两位日;同时拒掉了用斜杠的那条和年月日顺序颠倒的那条。整个过程不到十秒,我一个正则符号都没手写。如果想更严格,比如月份只能 01 到 12,可以再补几条边界样本让它收紧,或者把这条粗骨架带去 正则可视化 看清结构后手动微调。
我自己最常用它的两个场景
我个人用得最多的是提数据和校格式两件事。
提数据这边,最爽的是处理日志和导出文件。仓库导出里那种 SKU-AX-00421-RED 编号,以前我得对着字符串数"连字符在第几位、数字几位",现在三行当正例一贴,反例贴一条无关的总数行,工具直接给 SKU-[A-Z]{2}-\d{5}-[A-Z]{3},复制就能喂给命令行解析器。
校格式这边,反例是关键。表单收到 项目-001、项目-002,偶尔有人输成 Project-001。把中文那几条当正例、英文那条当反例,工具输出 项目-\d{3},前缀锁死中文,英文输错的那条被拒掉。没有反例的话,正则往往会偏松,把不想要的也放进来,所以哪怕只贴两三条近似的错例,价值都很大。
几条让结果更准的小经验
用下来踩过的坑,提前说一下:
- 正例至少贴 3 到 5 条,而且形状要有差异。只贴一两条,对齐算法没东西可比,结果会塌成
.+或\S+。 - 一定要配反例。反例就是告诉工具"什么必须拒",两三条拼写错或近似形状,就能把过宽的候选剔掉。
- 不要把不同形状混进同一组正例。邮箱和电话号混在一起,根本没有共同骨架,对齐会失效。按形状分组,每组单独反推一个。
- 它是启发式,不是穷尽。生产数据里如果有你样本没覆盖到的形状(比如 SKU 偶尔是 4 位数字),正则会漏。上线前务必拿更大的真实语料再测一遍,这一步可以直接在 正则测试 里完成。
写在最后
正则反推不是要取代你懂正则,而是把"从零回忆语法"这段最折磨人的过程省掉。你提供判断(哪些该中、哪些不该中),工具负责把判断翻译成符号,你再用测试器复核一遍。三步走下来,一条能用的正则通常一两分钟就到手了。下次再遇到"我知道想匹配什么,但懒得写"的时刻,先想想能不能用例子反推。
Made by Toolora · Updated 2026-06-13