许多命令行工具(grep
、flex
等)使用^
符号来表示“行的开头”,使用$
符号来表示“行的结尾”。这个约定是什么时候产生的?为此目的保留两个字符似乎是完全合理的,但在现代键盘上,该符号位于该符号$
的左侧,这有点奇怪。^
这是一个完全武断的决定吗?这是否来自一些较旧的键盘布局?使用此约定是否是因为某些较旧的工具决定以这种方式执行操作?
无论答案如何,是否有主要来源记录这一点?
答案1
QED 编辑器,写于 1965 年伯克利分时系统,$
用于寻址文件中的最后一行,就像今天ed
一样。看ex
vi
vim
手册第 2-1 页。但最初的 QED 编辑器不允许使用正则表达式。
Ken Thompson 后来(“1960 年代末”)为 Multics 编写了 QED 版本,这是第一个实现正则表达式的编辑器。该编辑器对 Ken 1969 年的ed
Unix 开发产生了重大影响(后来由 Dennis Richie 于 1971 年左右“定稿”)。 Bill Joy 出于对 的不满ed
,实施了ex
和vi
,这些是 1977 年 PDP-11 的第一个 BSD 版本的一部分。
^
and表达式$
以及后来成为 POSIX 正则表达式语法的大部分内容及其如今所具有的语义,均在 Ken 的 QED 版本中实现。看手册第 4 页。
目前尚不清楚这些特定符号的选择来自何处,但从$
用于寻址最后一行的方式来看,它已经具有“最后”的含义。
在某些终端上,^
无法生成该字符。因此允许\'
使用Ken 的 QED 编辑器来代替^
(参见贝尔实验室手册)。
答案2
此副本ed(I)
,日期为 11/3/71,来自 Unix 第一版,确认 是ed
基于 QED,并表明^
和$
具有当时的当前含义:
^
正则表达式开头的扬抑符 ( ) 与行开头的空字符匹配。- 正则表达式末尾的货币符号 (
$
) 与行末尾的空字符匹配。
此注和维基百科页面 grep
表明它 grep
创建于 20 世纪 70 年代初,并使用与 相同的正则表达式语法 ed
。
正则表达式的概念比它在计算机实用程序中的使用早了近二十年。
维基百科“正则表达式”页面
和 这个堆栈溢出问题
相信美国数学家 Stephen Cole Kleene 发明了正则表达式,或者至少描述了它们并创造了这个术语。许多历史文献都提到了他的论文,
神经网络和有限自动机中的事件表示(PDF)。这份 101 页的文件,日期为 1951 年 12 月 15 日,很难阅读,而且(据我所知)不是提及^
and$
语法。然而,它*
在论文第 49 页(PDF 文件第 52 页)上确实表示为“零个或多个前面的事物”。这(在某种程度上)被广泛称为“克林星”。