本文沿时间线追溯正则表达式从数学符号到多流派并存演进历程中的一个阶段。1969 年,汤普逊与同事里奇开始开发 Unix 操作系统。1971 年,正则表达式随 ed 编辑器进入 Unix。1973 年,ed 中的
g/re/p命令被提取为独立工具——grep。从此,正则表达式成为 Unix 系统中不可或缺的一部分。了解这段历史,有助于我们看清正则表达式各流派的由来,以及它们在表达力与可控性之间做出的不同权衡。
前情提要:在往期文章《【Linux·基础篇】Shell 基础|正则表达式:从神经元模型到多流派并存(三)》中,我们讲述了一段发生在 1968 年的往事。工程师需要工具,而工具又塑造着工程师的世界。1969 年,当工程师们开始构建 Unix 时,他们便带上了已经验证过的正则表达式。这一决定,让原本属于数学家的符号系统,进入了千千万万程序员的日常。如果克莱尼的工作定义了正则表达式“是什么”,那么 Unix 的工作就是让它“被广泛使用”。
就在汤普逊完成 QED 正则引擎后不久——1969 年,他和同事丹尼斯·麦卡利斯泰尔·里奇(Dennis MacAlistair Ritchie)¹开始在贝尔实验室开发一个名为 Unix 的新操作系统。²
Unix 的设计哲学是“简洁至上”——每个工具只做好一件事,但可以灵活组合。正则表达式天然符合这种哲学。1971 年,Unix 的第一个正式版本发布,其中包含了一个名为 ed 的行编辑器。汤普逊将在 QED 中实现的正则表达式功能移植到了 ed 中。
在 ed 中,用户可以输入这样的命令:
g/regular expression/p其中 g 表示全局(global),p 表示打印(print),而这里的 regular expression 表示正则表达式,在实际使用时会被替换为具体的匹配模式——比如 g/Linux/p 会找出所有包含 Linux 的行。
在日常交流中,使用者常将其缩写为 g/re/p。
这个组合命令使用频率极高,以至于 1973 年,汤普逊干脆把这几个字母抽出来,写成了一个独立的命令行工具。按照 g/re/p 的顺序,他给这个工具取名为 grep。
从此,grep 和正则表达式成为 Unix 系统中形影不离的伙伴,也是后世无数程序员学习正则表达式的入门工具。
【注 1】丹尼斯·麦卡利斯泰尔·里奇(Dennis MacAlistair Ritchie,1941–2011),美国计算机科学家,Unix 操作系统和 C 语言的共同创造者。他在贝尔实验室与肯·汤普逊长期合作,共同开发了 Unix。汤普逊创造了 B 语言,里奇在 B 的基础上创造了 C 语言。C 语言后来成为 Unix 及无数现代软件的基础。里奇还与汤普逊共同获得 1983 年图灵奖。
【注 2】Unix 的诞生本身有一个有趣的故事。汤普逊最初是为了能继续玩他写的一个名为“太空旅行”(Space Travel)的游戏,在实验室角落里找到了一台闲置的 PDP-7 计算机,在移植游戏的过程中逐渐写出了 Unix 的雏形。
grep 的诞生让正则表达式融入了 Unix 的血脉。但故事才刚刚开始。随着 Unix 的流行,越来越多的工具开始支持正则表达式,而每个工具都在按自己的方式“说”这门语言——碎片化,即将到来。
此番炼器手札,炉火尚未全熄。若道友观之有趣,或可暂留此间,结一尘缘。待下回开炉铸器,新得感悟,必先与同道分享。