<!-- title: 100秒正则神课：会写更要会跑 -->
<!-- domain: programming -->

# 100秒正则神课：会写更要会跑

## 概述

正则表达式是每个程序员都“会用一点”的工具，也是最多人只会复制粘贴的工具。Fireship 频道的《Regex in 100 Seconds》用不到两分钟，把正则的来历、写法和用途压缩成一支高密度短片，成为 YouTube 上播放量最高的正则入门视频之一。但100秒只够告诉你正则“是什么”，讲不了它“怎么跑”——而后者恰恰藏着一个能让全球网站瘫痪的性能陷阱。本文以这条视频为骨架，把视频里说到的和没来得及说的部分一次补齐：从1950年代的数学起源，到两种引擎路线的分野，再到2019年那场真实发生的“正则引发的全球宕机”。看完本文，你不仅能看懂视频里的每一个符号，还能回答一个视频没问的问题：这段正则，在线上跑得动吗？

## 视频基本信息

| 项目 | 内容 |
|------|------|
| 视频标题 | Regex in 100 Seconds（正则表达式100秒入门） |
| 频道 | Fireship（主理人 Jeff Delaney） |
| 发布时间 | 2020年1月（据频道页面） |
| 系列归属 | "in 100 Seconds" 快速概念系列 |
| 播放量 | 累计超400万（据频道页面显示量级；本轮未能实时核验，以频道当前页面为准） |
| 时长 | 约100秒 |

**数据说明**：本轮内容采集时，执行环境的搜索与网页抓取接口未获授权，无法实时抓取视频页快照，以上数据以频道历史页面信息为准做了量级化处理，未做精确编造。视频本体可在 YouTube 搜索「Fireship Regex in 100 Seconds」直达，频道主页为 youtube.com/@Fireship。

## 核心主张拆解

这条100秒的短片没有一句废话，叙事可以拆成四步，一步比一步具体。

**第一步：它是一个来自数学的老想法。**视频开篇点明，正则不是某家公司的发明，而是1950年代数学家研究“如何用有限符号描述字符串集合”时诞生的形式语言。这个定位很重要：正则首先是一门描述模式的小型语言，其次才是一堆符号速记。视频用几十秒就完成了这个“祛魅”——那些看起来像乱码的 `^`、`$`、`[a-z]`、`+`、`*`，其实是这门小语言的词汇表：锚点标记位置，字符类圈定候选，量词控制重复，分组负责归拢。

**第二步：一套十几个符号的词汇表，能写出千军万马的模式。**视频现场演示了用一条模式匹配文本——从一段字符串里捞出符合结构的片段，比如校验格式、提取内容。这正是正则的核心卖点：你写的不是“具体怎么找”的过程代码，而是“长什么样”的声明。循环、条件、临时变量统统消失，一行模式就是一条规格说明。

**第三步：它无处不在。**视频强调，正则早已内建在你每天的工具链里：命令行的 grep、编辑器的查找替换、几乎所有主流语言的标准库、表单校验、日志分析、爬虫清洗。这是“学一次到处用”的杠杆型技能——也是它尽管以难读著称，却始终死不了的原因。

**第四步：100秒结束，正则的另一半被留在了镜头外。**视频教会你“怎么写”，但没有告诉你“引擎怎么执行你写的模式”。而这半边故事里，藏着从 Ken Thompson 到 Google RE2 的六十年工程史，也藏着让 Cloudflare 在2019年全球宕机的惊魂27分钟。本文下面两节，专门讲这被剪掉的后半段。

## 知识与理论溯源

视频把正则的出身一笔带过，但这笔账值得细算，因为它解释了正则为什么天然“快”——以及什么情况下会变慢。

**1951–1956：克莱尼定义“正则事件”。**数学家 Stephen Cole Kleene 在论文《Representation of Events in Nerve Nets and Automata》中提出“正则事件”（regular events）的概念，证明用极少的运算符（连接、并、星号闭包）就能描述一类字符串集合。这就是“正则”这个名字的来源。乔姆斯基后来把它纳入语言分层，作为第三型语言。理论同时给出了边界：正则语言表达能力有限，比如它数不清无限嵌套的括号—— pump引理（pumping lemma）可以严格证明这一点。这也是“不要用正则解析 HTML/JSON”这一经典忠告的理论根源。

**1968：汤普逊把它变成软件。**贝尔实验室的 Ken Thompson 在《Communications of the ACM》发表论文《Regular Expression Search Algorithm》，首次把正则编译成 IBM 7094 上的机器码执行，关键技巧是同时模拟所有可能的匹配路径（NFA 模拟），而不是逐条试错。这项技术先进入文本编辑器 QED，随后传入 ed，再演化成 grep——`g/re/p` 这个命令名本身就是“全局/正则/打印”的缩写。注意：Thompson 的实现从第一天起就是线性时间的，快得惊人。

**1986–1997：回溯引擎一统江湖。**Henry Spencer 1986年发布的正则库（后被 Tcl、PostgreSQL 等广泛采用）和 Perl 带火的“正则方言扩展”（1997年 Philip Hazel 据此写出 PCRE）把正则推向了表达能力的新高度：反向引用、环视、递归模式。代价是——这些特性已经溢出了正则语言的数学边界，线性时间的自动机算法装不下它们，主流引擎集体转向“回溯”（backtracking）实现：匹配失败就退回上一个岔路口换条路再试。今天 JavaScript、Python、Java、PHP、Ruby、PCRE 全是这一路线。

**2007–2010：Cox 的檄文与 RE2 的回答。**Google 工程师 Russ Cox 在2007年发表系列文章《Regular Expression Matching Can Be Simple And Fast》，直接点破行业怪象：Java、Perl、PHP、Python、Ruby 的正则在恶意构造的模式面前会指数级变慢，而 Thompson 式算法六十年前就解决了这个问题。2010年 Google 开源 RE2，保证所有正则匹配都在线性时间内完成，代价是不支持反向引用等溢出特性。同一路线的现代代表还有 Rust 的 regex crate（ripgrep 的底层，文档明确声明永不回溯、对 ReDoS 免疫）。2014年 xkcd 第1313期“正则高尔夫”走红后，Peter Norvig 还专门写了分析文章，展示了“用最短正则区分两组词”背后的搜索式写法——正则作为一门语言，连它的玩梗都能被严谨地计算。

**事故注脚。**2019年7月2日，Cloudflare 因一条 WAF 规则里的正则发生灾难性回溯（多个 `.*` 量词叠加），CPU 被打满，全球约27分钟内大量请求返回502。Cloudflare 工程副总裁 John Graham-Cumming 在官方博客发布了完整复盘。OWASP 也将 ReDoS（正则拒绝服务）列为独立攻击类别。这就是“写得出”和“跑得动”分裂的血泪证据。

## 批判性审查

**证据充分的部分**：正则的数学起源、语法要素、工具普及度，视频讲得准确且克制，与上述文献完全对得上。“正则值得学”这个结论也有充分支撑——它是罕见的几十年语法不变、跨语言通用的技能。

**视频因篇幅被压缩、容易造成误解的部分**：一是“正则很快”的隐含印象。对绝大多数日常模式确实如此，但视频没有区分两条引擎路线——你写的同一段模式，在 Rust 标准库和在 Python 的 `re` 模块里，最坏情况耗时可能相差十几个数量级。二是“正则什么都能匹配”的误导风险。数学边界决定了它匹配不了无限嵌套结构，逞强去解析 HTML 只会产出传说中的“禁止用正则解析 HTML”梗图素材。三是可读性成本被轻轻带过。程序员圈那句老话——“遇到问题的人想：我知道了，用正则！于是他有了两个问题”——常被归于 Jamie Zawinski 名下，玩笑背后是真实的维护负担：正则是写给机器执行、不是写给人读的。

**需要读者自行补足的判断**：视频面向的是“认知建立”，不是“工程规范”。100秒的目标是让你不再怕那些符号，这一点它完成得极好；但把正则用进生产代码，需要本文学到的第二层知识兜底。

## 认知提升与实用启示

**一、写正则前，先问跑在哪个引擎上。**对外部输入做匹配、且流量来自不可信来源时，优先选线性时间引擎：Google RE2（C++/多语言绑定）或 Rust regex；若只能用回溯引擎（JS/Python/Java），就要控制量词嵌套，避免 `(.*)*` 这类组合，并给匹配加上超时或长度上限。这是一条按“威胁模型”选工具的工程直觉，比任何一条语法技巧都值钱。

**二、用即时反馈工具把正则当测试驱动着写。**regex101 这类在线工具会把你的模式逐步高亮、解释每个符号的作用、标出回溯步数。正确姿势是：拿真实样本当用例，改一个字符看一次匹配，写完把样本固化成单元测试。正则是声明式语言，最怕的是“在我机器上能跑”——测试是唯一的护城河。

**三、把复杂正则降维成人能读的形态。**多数语言支持冗长模式（verbose/free-spacing），允许换行和注释；或者干脆拆成几段简单正则加普通代码组合。评审正则的标准和评审代码一样：六个月后还能看懂的，才是合格的正则。记住 pumping lemma 给你的许可——匹配不了嵌套结构不是你菜，是该换解析器了。

## 视频论证结构图

```mermaid
flowchart TD
    A["视频主张<br/>正则是文本模式语言"] --> B["来历<br/>1950年代数学"]
    A --> C["写法<br/>锚点字符类量词"]
    A --> D["用武之地<br/>编辑器命令行代码"]
    C --> E["镜头外上半场<br/>引擎怎么执行"]
    E --> F["回溯路线<br/>PCRE与主流语言"]
    E --> G["自动机路线<br/>RE2与Rust regex"]
    F --> H["回溯失控<br/>2019全球宕机27分钟"]
    G --> I["线性时间<br/>对ReDoS免疫"]
    H --> J["深层结论<br/>会写还要会跑"]
    I --> J
```

## 延伸阅读

1. [Regular Expression Matching Can Be Simple And Fast — Russ Cox](https://swtch.com/~rsc/regex/) — 2007年的三篇系列文章，本文“两条引擎路线”叙事的第一手出处，看完能彻底理解回溯与自动机模拟的差别。
2. [Details of the Cloudflare outage on July 2, 2019 — Cloudflare Blog](https://blog.cloudflare.com/details-of-the-cloudflare-outage-on-july-2-2019/) — 正则灾难性回溯造成全球宕机的官方复盘，含问题正则的完整解剖。

## 参考来源

1. [Fireship 频道主页](https://www.youtube.com/@Fireship) — 视频出品方；正则短片可在频道内搜索「Regex in 100 Seconds」直达
2. [Wikipedia: Regular expression](https://en.wikipedia.org/wiki/Regular_expression) — Kleene 起源、Thompson 1968 论文与引擎发展史的综合条目
3. [Russ Cox 正则系列文章](https://swtch.com/~rsc/regex/) — 线性时间匹配算法与主流引擎缺陷的技术论证
4. [Cloudflare 2019年7月2日宕机复盘](https://blog.cloudflare.com/details-of-the-cloudflare-outage-on-july-2-2019/) — ReDoS 真实事故的一手报告
5. [xkcd 1313: Regex Golf](https://xkcd.com/1313/) — 正则文化梗原点；Norvig 的配套分析见 norvig.com

**说明**：以上参考链接均为长期稳定的经典来源；因本轮执行环境未授权联网，未能对链接现状与视频实时数据做在线核验，视频播放量等信息请以频道页面当前显示为准。

---
> 本文由「51学通信」技术团队出品。51学通信由通信行业18年老兵**爱卫生**（微信ID: gprshome201101）维护，聚焦5G/6G核心网、3GPP标准解读、通信前沿技术深度分析。
> 出版作品有《5G核心网原理与实践》《IMS原理与实践》等4本通信专业书籍。知识星球「51学通信」提供深度技术答疑和行业洞察。

> [!tip] 51学通信知识星球
> **星主：爱卫生**（微信：gprshome201101）——公众号「51学通信」创办者，19 年通信行业运维与讲师经验，著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书（各大电商平台有售）。
> **星球定位**：深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域，主打运维岗位与信令分析。
> **当前规模**：5200 篇主题 / 990 个回答，198 元/年。
> **加入福利**：加入星球后请加爱卫生微信，拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题，另有群内分享。
> **AI 加持**：51学通信知识星球已作为 skill 接入 WorkBuddy，使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例，做总结、找文档和 PPT 等场景全覆盖。

![51学通信知识星球海报-扫码加入](https://wiki.500nian.com/images/zhixingqiu_qrcode.png)
