正则表达式通常被用来检索、替换符合某个模式的文本,主流的开发语言对它都有支持。最近写正则表达式时对其由来起了兴趣,在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等)、数以亿万计的各种应用软件中,都可以看到正则表达式优美的舞姿。

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

  1. 百度html删除,百度推广记录如何删除?

    百度搜索可以说在我们的互联网生活中占着举足轻重的地位,我们很多知识都能从中找到.可有时候,我们搜索了内容时,却总是在打开的一些网站中发现很多与此相关的推广内容,让人看到有时候挺烦人的.那么,百度推广记 ...

  2. 如何删除百度搜索记录怎么删除

    很多朋友在使用百度搜索关键词时,发现百度会记录之前搜索的关键词,这样当你再次搜索相同的关键词时,可以快速显示,方便用户搜索,这为用户使用百度搜索引擎搜索关键词提供了方便,但也带来了另外一个问题,就是可 ...

  3. 2022.4.19百度笔试记录

    尝试了一下百度的笔试,记录一下过程. 首先是选择题,20道选择题,考的啥都有,Java,Linux,算法,SQL语句,操作系统,很乱很杂,都记不起来了,这里就不过多说了. 然后是三道编程题. 第一题: ...

  4. 基于百度地图记录运动轨迹案例分析与实现

    目录## 一.下载百度地图SDK 二. 工程配置 1. 新建Xcode工程 2. 获取Bundle Identifie 3. 申请key 4. 导入框架配置工程 第一步: 引入BaiduMapAPI. ...

  5. SSM框架超级详细整合记录:Spring+Spring MVC+MyBatis+Maven+MySQL

    1.前言 本文主要对SSM框架整合的过程进行记录,作为之后参考的依据. 1.1.参考文章 Spring代码实例系列-绪论 Spring MVC代码实例系列-绪论 MyBatis代码实例系列-绪论 1. ...

  6. 系统服务器无法理解您的搜索词.,关于360浏览器记录用户的百度搜索记录、常搜词问题2...

    在发现360安全浏览器明目张胆记录用户使用百度搜索引擎的搜索记录后,打开360浏览器用360搜索测试了一下,结果发现:用360搜索搜索过的记录几乎不出现在常搜词那里,但不管是通过①hao123主页的百 ...

  7. cas sso 整合记录

    首先说明下,我使用的cas-server版本是4.2.1 整合过程中遇到的问题及解决方式如下 1.因为使用https的话证书是个麻烦事,所以启用http 修改cas-server-webapp下的ca ...

  8. Swift上写百度地图记录

    1.新建SwiftDemoWorkspace 2.使用CocoaPods导入百度地图:传送门 3.为了能够在iOS9中正常使用地图SDK,请在"Info.plist"中进行如下配置 ...

  9. MY资源网址整合记录

    社会人 微信登录 QQ邮箱 百度翻译 程序猿SLAM CSDN-专业IT技术社区 Stack Overflow GitHub ROS KDevelop手册 Ubuntu论坛 Eigen特征 OpenC ...

最新文章

  1. springMVC参数的传递方式(1.通过@PathVariabl获取路径参数,2.@ModelAttribute获取数据,3.HttpServletRequest取参,4@RequestParam)
  2. MySQL 一个库中表数量是否有限制?
  3. 网站能拿到其他网站的cookie_如何设计网站能让网站建设的更有吸引力
  4. 用busybox制作并配置根文件系统
  5. c++ opencv mat_图像拼接Opencv源码重构
  6. 对象序列化与反序列化(二进制 byte[])
  7. js td innerHTML
  8. access ps4战地1要ea_EA游戏订阅服务将于2019年7月登陆PS4平台,抢先游玩枪车球新作...
  9. ai智能时代教育内容的改变_人工智能正在改变我们的评论方式
  10. windows程序设计一 最简单的windows程序
  11. mysql开启url重写_开启URL伪静态的方法
  12. ezcad旋转轴标刻参数_激光打标机软件ezcad中菜单下的地球仪标刻功能介绍及其操作设置...
  13. 计算机网络调试套什么定额,第一章计算机网络系统设备安装工程定额.docx
  14. Tangent Space的基向量计算方法
  15. 在北京拿40K的Java程序员,需要掌握哪些技术栈才能匹配阿里P7?
  16. 英语语法回顾3——名词和名词性从句
  17. 【android】项目案例(一)之超级课程表
  18. 莺尾花数据(画出不同分类器的ROC曲线)
  19. Android 自定义TabLayout
  20. IDEA2019.1.1破解(亲测有效)

热门文章

  1. 使用nginx上传大文件报500异常处理
  2. 风华是一指流砂,苍老了一段过往年华
  3. 计算当前时间距离元年一月一日的总天数,并显示现在是星期几
  4. 数字信号处理。 引言
  5. 【Fiddler】如何使用Fiddler中的Fiddler插件下载钉钉直播回放
  6. 【面试题】深复制与浅复制的区别
  7. 会计基础(一):记账基础 - 复式记账法
  8. 转:管理者既要疏通水管,又要写诗歌
  9. Python入门神图一张
  10. Docker镜像拉取报错:Error response from daemon: Get https://registry-1.docker.io/v2/