正则表达式的由来(Wikipedia和百度整合记录)

正则表达式通常被用来检索、替换符合某个模式的文本,主流的开发语言对它都有支持。最近写正则表达式时对其由来起了兴趣,在Wikipedia和百度百科分别检索了一下,搬运过来留作收藏记录。Wikipedia的介绍更专业一些,阅读较为费力。百度百科的介绍读起来更像讲故事,通俗易懂一些。

以下摘录自Wikipedia

详见原文"History"板块,原文链接:https://en.wikipedia.org/wiki/Regular_expression#cite_note-FOOTNOTEKleene1951-4

正则表达式起源于1951年,当时数学家Stephen Cole Kleene使用他的称为正则事件的数学符号描述了正则语言。这些出现在理论计算机科学,自动机理论(计算模型)以及形式语言的描述和分类的子领域中。模式匹配的其他早期实现包括SNOBOL语言,该语言不使用正则表达式,而是使用其自己的模式匹配结构。

从1968年开始,正则表达式有两种用法:在文本编辑器中进行模式匹配和在编译器中进行词法分析。程序形式的正则表达式的首次出现是Ken Thompson将Kleene的符号内置到编辑器QED中的一种方式,以匹配文本文件中的模式。为了提高速度,Thompson通过即时编译(JIT)对Compatible Time-Sharing System上的IBM 7094代码实施了正则表达式匹配,这是JIT编译的重要早期示例。后来,他将此功能添加到Unix编辑器ed中,最终导致了流行的搜索工具grep使用正则表达式(“ grep”是从ed编辑器中用于正则表达式搜索的命令衍生的单词:g / re / p表示“全局搜索正则表达式和打印匹配行”)。在汤普森开发QED的同时,包括Douglas T. Ross在内的一组研究人员实现了一种基于正则表达式的工具,该工具用于编译器设计中的词法分析。

这些原始形式的正则表达式的许多变体在1970年代的Bell Labs的Unix 程序中使用,包括vi,lex,sed,AWK和expr,以及其他程序(例如Emacs)。随后,正则表达式被各种程序采用,这些早期形式在1992年的POSIX.2标准中得到了标准化。

在1980年代,Perl中出现了更复杂的正则表达式,最初是由Henry Spencer(1986)编写的正则表达式库派生的,后者后来为Tcl编写了高级正则表达式的实现。Tcl库是具有改进的性能特征的NFA / DFA混合实现。采用Spencer Tcl正则表达式实现的软件项目包括PostgreSQL。 Perl随后扩展了Spencer的原始库,以添加许多新功能。 Perl 6设计的部分工作是改善Perl的正则表达式集成,并增加其范围和功能,以允许定义解析表达式语法。结果是一种称为Perl 6规则的迷你语言,该规则用于定义Perl 6语法并为使用该语言的程序员提供工具。这些规则保留了Perl 5.x正则表达式的现有功能,但也允许通过子规则以BNF样式定义递归下降解析器。

正则表达式在结构化信息标准中用于文档和数据库建模的使用始于1960年代,并在1980年代得到扩展,当时,诸如ISO SGML(由ANSI“ GCA 101-1983”取代)的行业标准得到了巩固。结构规范语言标准的内核由正则表达式组成。它的使用在DTD元素组语法中很明显。

Philip Hazel从1997年开始开发了PCRE(与Perl兼容的正则表达式),它试图紧密模仿Perl的正则表达式功能,并被许多现代工具所使用,包括PHP和Apache HTTP Server。

如今,正则表达式在编程语言,文本处理程序(尤其是词法分析器),高级文本编辑器和其他一些程序中得到广泛支持。正则表达式支持是许多编程语言(包括Java和Python)的标准库的一部分,并内置于其他语言(包括Perl和ECMAScript)的语法中。正则表达式功能的实现通常称为正则表达式引擎,许多库可供重用。

英文原版:

Regular expressions originated in 1951, when mathematician Stephen Cole Kleene described regular languages using his mathematical notation called regular events. These arose in theoretical computer science, in the subfields of automata theory (models of computation) and the description and classification of formal languages. Other early implementations of pattern matching include the SNOBOL language, which did not use regular expressions, but instead its own pattern matching constructs.

Regular expressions entered popular use from 1968 in two uses: pattern matching in a text editor and lexical analysis in a compiler. Among the first appearances of regular expressions in program form was when Ken Thompson built Kleene's notation into the editor QED as a means to match patterns in text files. For speed, Thompson implemented regular expression matching by just-in-time compilation (JIT) to IBM 7094 code on the Compatible Time-Sharing System, an important early example of JIT compilation. He later added this capability to the Unix editor ed, which eventually led to the popular search tool grep's use of regular expressions ("grep" is a word derived from the command for regular expression searching in the ed editor: g/re/p meaning "Global search for Regular Expression and Print matching lines"). Around the same time when Thompson developed QED, a group of researchers including Douglas T. Ross implemented a tool based on regular expressions that is used for lexical analysis in compiler design.

Many variations of these original forms of regular expressions were used in Unix programs at Bell Labs in the 1970s, including vi, lex, sed, AWK, and expr, and in other programs such as Emacs. Regexes were subsequently adopted by a wide range of programs, with these early forms standardized in the POSIX.2 standard in 1992.

In the 1980s the more complicated regexes arose in Perl, which originally derived from a regex library written by Henry Spencer (1986), who later wrote an implementation of Advanced Regular Expressions for Tcl. The Tcl library is a hybrid NFA/DFA implementation with improved performance characteristics. Software projects that have adopted Spencer's Tcl regular expression implementation include PostgreSQL. Perl later expanded on Spencer's original library to add many new features. Part of the effort in the design of Perl 6 is to improve Perl's regex integration, and to increase their scope and capabilities to allow the definition of parsing expression grammars. The result is a mini-language called Perl 6 rules, which are used to define Perl 6 grammar as well as provide a tool to programmers in the language. These rules maintain existing features of Perl 5.x regexes, but also allow BNF-style definition of a recursive descent parser via sub-rules.

The use of regexes in structured information standards for document and database modeling started in the 1960s and expanded in the 1980s when industry standards like ISO SGML (precursored by ANSI "GCA 101-1983") consolidated. The kernel of the structure specification language standards consists of regexes. Its use is evident in the DTD element group syntax.

Starting in 1997, Philip Hazel developed PCRE (Perl Compatible Regular Expressions), which attempts to closely mimic Perl's regex functionality and is used by many modern tools including PHP and Apache HTTP Server.

Today, regexes are widely supported in programming languages, text processing programs (particularly lexers), advanced text editors, and some other programs. Regex support is part of the standard library of many programming languages, including Java and Python, and is built into the syntax of others, including Perl and ECMAScript. Implementations of regex functionality is often called a regex engine, and a number of libraries are available for reuse.

 

以下摘录自百度百科

详见原文“起源”板块,原文地址:https://baike.baidu.com/item/正则表达式

正则表达式的“鼻祖”或许可一直追溯到科学家对人类神经系统工作原理的早期研究。美国新泽西州的Warren McCulloch和出生在美国底特律的Walter Pitts这两位神经生理方面的科学家,研究出了一种用数学方式来描述神经网络的新方法,他们创造性地将神经系统中的神经元描述成了小而简单的自动控制元,从而作出了一项伟大的工作革新。

在1951 年,一位名叫Stephen Kleene的数学科学家,他在Warren McCulloch和Walter Pitts早期工作的基础之上,发表了一篇题目是《神经网事件的表示法》的论文,利用称之为正则集合的数学符号来描述此模型,引入了正则表达式的概念。正则表达式被作为用来描述其称之为“正则集的代数”的一种表达式,因而采用了“正则表达式”这个术语。

之后一段时间,人们发现可以将这一工作成果应用于其他方面。Ken Thompson就把这一成果应用于计算搜索算法的一些早期研究,Ken Thompson是 Unix的主要发明人,也就是大名鼎鼎的Unix之父。Unix之父将此符号系统引入编辑器QED,然后是Unix上的编辑器ed,并最终引入grep。Jeffrey Friedl 在其著作《Mastering Regular Expressions (2nd edition)》(中文版译作:精通正则表达式,已出到第三版)中对此作了进一步阐述讲解,如果你希望更多了解正则表达式理论和历史,推荐你看看这本书。

自此以后,正则表达式被广泛地应用到各种UNIX或类似于UNIX的工具中,如大家熟知的Perl。Perl的正则表达式源自于Henry Spencer编写的regex,之后已演化成了pcre(Perl兼容正则表达式Perl Compatible Regular Expressions),pcre是一个由Philip Hazel开发的、为很多现代工具所使用的库。正则表达式的第一个实用应用程序即为Unix中的 qed 编辑器。

然后,正则表达式在各种计算机语言或各种应用领域得到了广大的应用和发展,演变成为计算机技术森林中的一只形神美丽且声音动听的百灵鸟。

以上是关于正则表达式的起源和发展的历史描述,如今正则表达式在基于文本的编辑器和搜索工具中依然占据着一个非常重要的地位。

在最近的六十年中,正则表达式逐渐从模糊而深奥的数学概念,发展成为在计算机各类工具和软件包应用中的主要功能。不仅仅众多UNIX工具支持正则表达式,近二十年来,在WINDOWS的阵营下,正则表达式的思想和应用在大部分 Windows 开发者工具包中得到支持和嵌入应用!从正则表达式在Microsoft Visual Basic 6 或 Microsoft VBScript到.NET Framework中的探索和发展,WINDOWS系列产品对正则表达式的支持发展到无与伦比的高度,几乎所有 Microsoft 开发者和所有.NET语言都可以使用正则表达式。如果你是一位接触计算机语言的工作者,那么你会在主流操作系统(*nix[Linux, Unix等]、Windows、HP、BeOS等)、主流的开发语言(delphi、Scala、PHP、C#、Java、C++、Objective-c、Swift、VB、Javascript、Ruby以及Python等)、数以亿万计的各种应用软件中,都可以看到正则表达式优美的舞姿。

你可能感兴趣的:(计算机理论与基础)