首页 › programming › 100秒正则神课:会写更要会跑

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 给你的许可——匹配不了嵌套结构不是你菜,是该换解析器了。

视频论证结构图

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 — 2007年的三篇系列文章,本文“两条引擎路线”叙事的第一手出处,看完能彻底理解回溯与自动机模拟的差别。
  2. Details of the Cloudflare outage on July 2, 2019 — Cloudflare Blog — 正则灾难性回溯造成全球宕机的官方复盘,含问题正则的完整解剖。

参考来源

  1. Fireship 频道主页 — 视频出品方;正则短片可在频道内搜索「Regex in 100 Seconds」直达
  2. Wikipedia: Regular expression — Kleene 起源、Thompson 1968 论文与引擎发展史的综合条目
  3. Russ Cox 正则系列文章 — 线性时间匹配算法与主流引擎缺陷的技术论证
  4. Cloudflare 2019年7月2日宕机复盘 — ReDoS 真实事故的一手报告
  5. xkcd 1313: Regex Golf — 正则文化梗原点;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学通信知识星球海报-扫码加入