---
title: "发明正则表达式的人，上周走了"
description: "悼念图灵奖得主 Michael Rabin：他与 Scott 证明的 NFA 与 DFA 等价定理成为正则表达式引擎的源头，Miller-Rabin 素性检验至今支撑着 HTTPS 加密。"
date: 2026-04-21T11:51:32Z
canonical: https://xiaobox.github.io/p/2026-04-21-fa-ming-zheng-ze-biao-da-shi-de-ren-shang-zhou-zou-le/
author: 小盒子
categories: ["行业与思考"]
license: CC BY-NC-SA 4.0
license_url: https://creativecommons.org/licenses/by-nc-sa/4.0/
---

# 发明正则表达式的人，上周走了


前两天我在写一个表单校验，顺手敲了一行 `/^1\d{10}$/`，校验手机号。这东西每天都在敲，手指比脑子快，根本没想过它从哪来的。

直到前几天看到一条消息，Michael Rabin 走了，94 岁。

名字有点耳熟，但一时没想起来这是谁。去搜了一下他的资料，才反应过来，原来每天敲的 \d+、每次 grep、每次填表单时那个「邮箱格式不对」的红字，背后那个东西，是他 26 岁那年和同门师弟在 IBM 打暑期工的时候一起搞出来的。

搞出来那会儿他们不是在发明工具。他们是在证一个数学定理。

故事从 1957 年说起。

那年夏天 Rabin 刚从普林斯顿博士毕业。他导师叫 Alonzo Church，图灵当年的那个导师。同门师弟叫 Dana Scott，比他小一届还在读博。IBM 那年给两个人各发了一份 summer research 的 offer，没定任务，就把他俩弄到研究院养着让他们想点理论问题。

他俩琢磨的是个挺偏的东西，叫有限自动机。这玩意 1950 年代在学术圈挺热，但离真实世界远得很。

这东西也不是凭空冒出来的。1943 年 McCulloch 和 Pitts 在一篇讲神经元的论文里搭了骨架，1951 年夏天数学家 Kleene 在 RAND 用三个算子描述了神经网络能识别的模式，就是正则表达式的原型（「regular expressions」这个词 5 年后才正式出现）。1957 年夏天 Rabin 和 Scott 接过来的，是 14 年的积累。

自动机可以理解成一台想象里的机器。它只会一个字符一个字符往前读，读一个跳一次状态。没内存没栈，一个状态跳来跳去的小破机器。

这东西有两种。一种叫 DFA，每一步下一个状态是唯一定死的。另一种叫 NFA，它可以同时处在好几个状态里，像量子的影子。按直觉 NFA 应该比 DFA 强，毕竟能同时走几条路嘛。

Rabin 和 Scott 证了一件事，NFA 和 DFA 等价。任何 NFA 能识别的字符串集合，都可以改造成一个 DFA 来识别。反过来也成立。

一个看上去更强的东西，和那个看上去更弱的一样。

这论文 1959 年发在 IBM 自己家的刊物上，叫《Finite Automata and Their Decision Problems》。学术圈的人读了觉得有意思。工业界没人搭理。

这论文后来给两个人拿了 1976 年图灵奖。

讲到这你可能觉得行吧，一个数学定理，跟咱们写代码有啥关系。

关系在 9 年之后。

1968 年 6 月，贝尔实验室一个 25 岁的小伙子叫 Ken Thompson，在 Communications of the ACM 上发了一篇论文，标题叫《Regular Expression Search Algorithm》。

Thompson 当时想干的事挺简单。他在写一个文本编辑器叫 QED，他想让用户能在文件里按「模式」搜字符串，不是精确匹配一个词，是匹配一类东西，比如所有以数字开头的行。

这需求现在每个程序员都熟。1968 年没人干过。

Thompson 翻书的时候看到了 Rabin 和 Scott 1959 年那篇论文，一拍脑袋发现这俩东西能对上。用户写的那个「模式」可以转成一个 NFA，然后用 Rabin-Scott 定理把它编译成一个 DFA，跑起来又快又准。一个纯数学证明，当场变成了一个真能用的字符串搜索引擎。

Thompson 1968 年那篇论文是今天所有正则表达式引擎的祖宗。

他先把这玩意塞进 QED，后来移植到 Unix 的 ed 编辑器，再后来切出来一个独立工具叫 grep。再后来 Perl 把正则玩成了一种次文化。再后来 Python、JavaScript、Java、Go 都内置了正则。再后来你公司表单那个「邮箱格式不正确」的红字，都是它。

一个 26 岁数学系学生在 IBM 打暑期工证的定理，9 年之后落进一个 25 岁工程师的眼里，60 多年之后落进你我每一天的键盘上。

每一代工程师都以为自己在发明新东西。其实大部分时间，咱们都在把上一代数学家证过的定理做成工具。

这还不算完。

1976 年 Rabin 在 MIT 访问，听说一个叫 Gary Miller 的年轻人搞了个快速判断大整数是不是质数的算法。Miller 那个算法有一个小毛病，它依赖一个叫广义黎曼猜想的数学假设。而黎曼猜想到今天都没人证出来。

Rabin 琢磨了一下，1980 年把 Miller 的算法改成了一个概率版本。不用黎曼猜想，牺牲一点精度（万亿分之一的出错概率），换来无条件可用。这就是 Miller-Rabin 算法。

Miller-Rabin 今天干啥用呢？

你每次打开银行 App，那个 HTTPS 小锁头，后面都有 RSA 加密在工作。RSA 的前提是你得快速生成两个大到离谱的质数。你浏览器里 openssl genrsa 命令每次跑出来的质数，都是 Miller-Rabin 一遍遍随机试出来的。全球几十亿台设备每天几万亿次加密握手，底下全是同一个人 1980 年想出来的那套办法。

这还不是他的全部。

Rabin 指纹算法，rsync 和几乎所有现代备份系统在用。Rabin 不经意传输，今天多方安全计算的数学基石。Rabin 密码系统，比 RSA 更早的一版公钥加密。

这人一辈子搞的东西，基本塞满了你每天用电脑的每一个缝隙。

但他在数学界之外不算出名。

介绍他的文章不多。讣闻那天纽约时报和主流媒体都没头版。主要是技术圈自己人在传。

这挺符合老爷子的人设的。他干的都是底下的活儿，你看不见，但你每敲一次键盘都在踩他的路。

Rabin 1931 年生在德国 Breslau，今天那地方叫波兰的 Wrocław。他爸是拉比。30 年代欧洲局势一变，全家逃到当时英国托管的巴勒斯坦。他这辈子换了三个国家、两次战争、两次流亡，最后在 2026 年 4 月 14 号走了，94 岁。

你每天写的 \d+，每次 git grep，每次访问银行网站，都是他留下的东西。

他走了，那些东西还在。
