首页 › programming › 一百秒的正则,六十年恩怨史

概述:为什么是这条视频

如果你只能看一条讲正则表达式的视频,那大概率应该是它——Fireship 频道的《Regex in 100 Seconds》(100 秒学会正则表达式)。这条两分钟不到的小课,是程序员社区里被转传最广的正则入门材料之一,也是“100 秒系列”里长盛不衰的一期。它把正则的语法骨架在一口气里讲完,但真正值得深挖的,是它没时间讲的那部分:正则背后六十多年的理论恩怨、两种引擎的路线之争,以及一条写坏的正则如何在 2019 年放倒半个互联网。本文带你把这条视频“看完”,并且多懂一层。

视频基本信息

项目 内容
视频标题 Regex in 100 Seconds(100 秒学会正则表达式)
频道 Fireship(主理人 Jeff Delaney)
所属系列 "X in 100 Seconds" 快速入门系列
上线时间 2020 年(据频道页面)
播放量 累计约数百万次(据频道页面,以实时数据为准)
时长 约 2 分钟

注:以上数据据频道页面,播放量随时间持续增长,请以 YouTube 页面实时显示为准。

视频讲了什么:100 秒走完的语法地图

按叙事顺序,这条视频其实只做了一件事:把正则表达式的“积木盒”打开,让你看见里面有几块积木。

第一块:正则是“模式即程序”。 视频开宗明义——正则表达式(Regular Expression,简称 regex)是一串字符构成的搜索模式,你写下一段式子,它就能在文本里替你找到、验证、替换所有符合条件的内容。这是全片的核心心智模型:正则不是字符串匹配的捷径,而是一种极小型的声明式编程语言。你写的不是“找到 abc 这个词”,而是“找到所有满足这个结构的片段”。

第二块:语法积木四件套。 视频快速过了一遍正则的字母表:字符集与区间([abc]、[0-9]、[^…] 取反),元字符缩写(\d 数字、\w 单词字符、\s 空白),量词(* 零个及以上、+ 一个及以上、? 可选、{n,m} 指定次数),以及锚点与分组(^ 开头、$ 结尾、() 捕获组)。最后还有全局/忽略大小写等标志位。这四件套构成了 95% 日常正则的全部词汇量。

第三块:实战一条龙。 视频的收尾是用这些积木现场拼一条邮箱验证正则——从匹配字面前缀,到 @,到域名结构,一步步把模式“长”出来。这一段的价值不在邮箱本身,而在于演示了正则的思考方式:把一个文本结构翻译成一棵模式树。

第四块:留白的敬畏感。 视频结尾几乎必然要提一句:正则以难读、难维护著称。这句话被无数弹幕会心一笑地刷过,但它其实是整条视频最有信息量的注脚——也是本文后面要展开的主线。

知识与理论溯源:这段语法从哪来

视频没时间讲的,是这条知识链的纵深。正则的每一段语法背后,都站着真实的人和工程史。

起点是神经元,不是计算机。 1943 年,神经生理学家沃伦·麦卡洛克(Warren McCulloch)与逻辑学家沃尔特·皮茨(Walter Pitts)发表论文《神经活动内在思想的逻辑演算》,用数学描述神经元如何组成网络处理事件。1956 年,数学家斯蒂芬·科尔·克林(Stephen Cole Kleene)在论文《神经网络的表示与自动机》中,把这类网络的能力抽象成一种代数——这就是“正则表达式”的数学起源。也就是说,正则天生是“用小符号描述大结构”的理论工具。

肯·汤普森把它塞进了编辑器。 1960 年代末,贝尔实验室的肯·汤普森(Ken Thompson,1983 年图灵奖得主)把正则实现进 QED 编辑器,随后是 ed。1968 年他在《ACM 通信》发表论文《正则表达式搜索算法》,思路激进到今天看仍属炫技:把正则直接编译成机器码来执行。后来 Unix 上的 grep,名字就是 ed 命令 g/re/p(全局搜索正则并打印)的缩写——你在终端敲下的每一次 grep,都是在给 1968 年的贝尔实验室续费。

两条路线的分裂。 汤普森当年的实现走的是有限自动机(finite automata)路线:把模式编译成状态机,匹配时间与文本长度成线性关系,永不失控。但 1980 年代 Perl 兴起后,为了支持反向引用、环视这些自动机难以表达的特性,主流实现转向了“回溯”(backtracking)引擎:匹配失败就退回去换条路再试。Henry Spencer 1986 年的 C 语言正则库、后来的 PCRE(Perl Compatible Regular Expressions,被 Apache、PHP、Nginx 等广泛采用)都属于这条线。今天 JavaScript、Python、Java 的内置正则,也几乎全是回溯引擎。回溯换来了表达力,代价后面再谈。

现代的反攻。 2007 年前后,Google 工程师 Russ Cox 发表系列文章《正则匹配可以又简单又快》,系统指出主流语言的正则引擎放弃了理论保证、性能可以差出几个数量级。Google 随后开源了线性时间的 RE2 引擎;Andrew Gallant 开发的 Rust regex 库(ripgrep 的内核)同样走自动机路线,配合字面量预过滤等工程优化,成为“既快又安全”的现代范本。

那句著名毒舌。 1997 年,程序员杰米·加温斯基(Jamie Zawinski)在新闻组里写道:“有些人遇到问题时会想‘我知道,我用正则吧’。现在他们有两个问题了。”这句话流传了近三十年,本意不是骂正则,而是提醒:正则是为“文本模式”设计的,不是为“结构解析”设计的。

批判性审查:哪些可信,哪些要打折

证据充分的部分: 正则的理论根基(克林代数、自动机理论)是计算理论的标准内容;它在文本处理中的工程地位有六十余年历史背书;视频演示的语法四件套属于各家方言(JS/Python/PCRE)中高度通用的公共子集,作为入门没有问题。

要打折的部分有三处。

第一,“100 秒学会”是系列营销话术。100 秒能学会的是语法词汇表,而不是写正则的能力。正则的真正难点在于组合爆炸:每块积木都简单,拼起来却极易出错、极难调试。看懂 \w+@\w+\.\w+ 和能在生产代码里写出可维护的正则,中间隔着无数个凌晨。

第二,视频没讲的暗雷:灾难性回溯(catastrophic backtracking,业界称 ReDoS)。回溯引擎遇到嵌套量词(如 (a+)+$)配上一段精心或无意构造的文本,匹配步数会指数级爆炸——文本长一点,就要算到宇宙热寂。这不是理论担忧:2019 年 7 月 2 日,Cloudflare 一条 Web 应用防火墙规则里形如 .*.*=.*! 的正则在边缘节点触发灾难性回溯,CPU 被打满,全球大量网站集体 502,约半小时后才恢复(据 Cloudflare 官方复盘博客)。事后 Cloudflare 表示要逐步把 WAF 迁往不回溯的 Rust 正则实现。一条正则放倒半个互联网,这在其他语言特性里几乎找不到对标案例。

第三,邮箱正则的“完备性骗局”。视频演示的简化版邮箱正则能过大多数演示场景,但如果要完整符合 RFC 822/5322 邮箱语法的正则,流传版本长达数千字符。更根本的限制来自乔姆斯基层级:正则只能描述“正则语言”,无法处理任意深度的嵌套结构——所以“用正则解析 HTML/JSON”注定是错误路线,那需要真正的解析器。Zawinski 那句话的完整含义就在这里。

认知提升:三条可以带走的规则

规则一:动手前先问“这是不是正则语言”。 目标文本是平铺的模式(日志行、编号、日期、URL 片段),正则是利器;目标是嵌套结构(HTML 标签、JSON、代码块),直接放弃正则,去写解析器或用现成库。这一问能拦住 80% 的正则事故。

规则二:把正则当代码写,而不是当咒语贴。 用 regex101 这类可视化调试工具构建和验证;用扩展模式(verbose mode)给长正则加注释和换行;为核心正则写单元测试,包括边界输入。一条出现在代码评审里的正则,应该能像函数一样被读懂、被测试、被重构。

规则三:守住性能与安全红线。 写量词时警惕嵌套((\w+)+、(.*)* 是经典毒药);对不可信输入做长度上限;在安全敏感或高并发路径上,优先选择不回溯的线性引擎(RE2、Rust regex 系)。做代码安全审计时,把每个对外部输入运行的正则都视为潜在攻击面。

一张图看懂这条视频的知识结构

flowchart TD
    A[Fireship 正则100秒] --> B[模式即程序]
    B --> C[语法积木四件套]
    C --> C1[字符集与元字符]
    C --> C2[量词]
    C --> C3[锚点分组与标志]
    B --> D[理论源头]
    D --> D1[1943神经元模型]
    D --> D2[1956克林代数]
    D --> D3[1968汤普森编译正则]
    B --> E[引擎两条路线]
    E --> E1[回溯引擎<br/>Perl PCRE JS]
    E --> E2[自动机引擎<br/>RE2 ripgrep]
    E1 --> F[灾难性回溯 ReDoS]
    F --> G[2019 Cloudflare全球宕机]
    E2 --> H[线性时间有保证]
    G --> I[三条实践守则]
    H --> I
    I --> I1[先判断是否正则语言]
    I --> I2[正则当代码写]
    I --> I3[关键路径避开回溯]

延伸阅读

  1. Russ Cox《Regular Expression Matching Can Be Simple And Fast》系列 — 现代正则引擎路线之争的最佳长文,读完你会重新审视所有语言的内置正则。
  2. regular-expressions.info(Jan Goyvaerts 维护)— 最系统的正则语法参考站,各方言差异一查便知。

参考来源

  1. Fireship 频道页 — 《Regex in 100 Seconds》所在频道,可在频道搜索栏检索该视频
  2. Regular Expression Matching Can Be Simple And Fast — Russ Cox — 回溯引擎与自动机引擎路线之争的源头文章
  3. Regular expression — Wikipedia — 正则从克林到汤普森的历史与理论脉络
  4. ReDoS — Wikipedia — 灾难性回溯攻击的定义、案例与防御
  5. Details of the Cloudflare outage on July 2, 2019 — Cloudflare Blog — 一条正则放倒全球网络的官方复盘

本文由「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学通信知识星球海报-扫码加入