正则表达式
编辑正则表达式(简称为regex或regexp;有时也被称为理性表达式)是一个字符序列,用于指定文本中的搜索模式。通常,这种模式被字符串搜索算法用于对字符串进行查找或查找和替换操作,或用于输入验证。正则表达式技术是在理论计算机科学和形式语言理论中发展起来的。正则表达式的概念始于20世纪50年代,当时美国数学家StephenColeKleene正式提出了正则语言的概念。它们随着Unix文本处理工具的出现而被普遍使用。自20世纪80年代以来,存在不同的编写正则表达式的语法,其中一种是POSIX标准,另一种是广泛使用的Perl语法。正则表达式被用于搜索引擎、文字处理器和文本编辑器的搜索和替换对话框、文本处理工具,如sed和AWK,以及词法分析中。大多数通用编程语言或通过库来支持正则表达式功能,包括Python、C、C++、Java、Rust、OCaml和JavaScript。
正则表达式的历史
编辑正则表达式起源于1951年,当时数学家StephenColeKleene用他的数学符号描述了正则语言,称为正则事件。它们出现在理论计算机科学、自动机理论(计算模型)以及形式语言的描述和分类等子领域中。其他早期的模式匹配的实现包括SNOBOL语言,它没有使用正则表达式,而是使用自己的模式匹配结构。正则表达式从1968年开始在两种用途中进入大众视野:文本编辑器中的模式匹配和编译器中的词法分析。正则表达式首次以程序形式出现是在KenThompson将Kleene的符号植入编辑器QED中,作为匹配文本文件中模式的一种手段。为了提高速度,汤普森在兼容时间共享系统上通过及时编译(JIT)对IBM7094代码实现了正则表达式匹配,这是JIT编译的一个重要的早期例子。后来,他将这种能力添加到Unix编辑器ed中,这最终导致了流行的搜索工具grep对正则表达式的使用(grep这个词来源于ed编辑器中正则表达式搜索的命令:g/re/p意思是全局搜索正则表达式和打印匹配行)。大约在汤普森开发QED的同时,包括DouglasT.Ross在内的一群研究人员实现了一个基于正则表达式的工具,该工具被用于编译器设计中的词法分析。1970年代,贝尔实验室的Unix程序中使用了这些正则表达式原始形式的许多变体,包括vi、lex、sed、AWK和expr,以及其他程序,如Emacs(它有自己的、不兼容的语法和行为)。Regexes随后被广泛的程序采用,这些早期的形式在1992年的POSIX.2标准中被标准化。在20世纪80年代,更复杂的重码出现在Perl中,它最初来源于HenrySpencer(1986)编写的重码库,后来他为Tcl编写了高级正则表达式的实现。Tcl库是一个混合的NFA/DFA实现,具有改进的性能特征。采用Spencer的Tcl正则表达式实现的软件项目包括PostgreSQL。后来Perl在Spencer的原始库上进行了扩展,增加了许多新的功能。在Raku(原名Perl6)的设计中,部分努力是为了改进Perl的regex集成,并增加它们的范围和能力,以允许定义解析表达式语法。其结果是一种叫做Raku规则的迷你语言,它被用来定义Raku语法以及为程序员提供一种语言的工具。这些规则保持了Perl5.xregexes的现有特性,但也允许通过子规则进行BNF式的递归解析器的定义。
在文档和数据库建模的结构化信息标准中使用重码开始于20世纪60年代,在20世纪80年代,当像ISOSGML(由ANSIGCA101-1983预示)这样的工业标准合并时,重码的使用得到了扩展。结构规范语言标准的内核由重组词组成。它的使用在DTD元素组的语法中是很明显的。在使用正则表达式之前,许多搜索语言允许简单的通配符,例如,*可以匹配任何字符序列,而?可以匹配单个字符。今天在文件名的glob语法和SQL的LIKE操作符中可以找到这种做法的遗迹。从1997年开始,PhilipHazel开发了PCRE(Perl兼容正则表达式),它试图密切模仿Perl的regex功能,并被许多现代工具包括PHP和ApacheHTTP服务器所使用。今天,在编程语言、文本处理程序(特别是词法)、Adv.
内容由匿名用户提供,本内容不代表vibaike.com立场,内容投诉举报请联系vibaike.com客服。如若转载,请注明出处:https://vibaike.com/164073/