正则表达式是描述文本模式的表示法,它可以有效地构造一种用于模式匹配的专用语言。虽然正则表达式可以有多种不同的形式,但它们都有着共同的特点:模式中的大多数字符都是匹配字符串中的字符本身,但有些元字符(metacharacter)却有着特定的含义,例如*表示某种重复,而[...]表示方括号中字符集合的任何一个字符。实际上,在文本编辑器之类的程序中,所执行的查找操作都是查找文字,因此正则表达式通常是像“print”之类的字符串,而这类字符串将与文档中所有的“printf”或者“sprintf”或者“printer paper”相匹配。在Unix和Windows中可以使用所谓的通配符来指定文件名,其中字符*可以用来匹配任意数量的字符,因此匹配模式*.c就将匹配所有以.c结尾的文件。此外,还有许许多多不同形式的正则表达式,甚至在有些情况下,这些正则表达式会被认为都是相同的。Jeffrey Friedl编著的《Mastering Regular Expressions》一书对这一方面问题进行了广泛的研究。Stephen Kleene在20世纪50年代的中期发明了正则表达式,用来作为有限自动机的表示法,事实上,正则表达式与其所表示的有限自动机是等价的。20世纪60年代年代中期,正则表达式最初出现在Ken Thompson版本的QED文本编辑器的程序设置中。1967年Thompson申请了一项基于正则表达式的快速文本匹配机制的专利。这项专利在1971年获得了批准,它是最早的软件专利之一[U.S. Patent 3,568,156, Text Matching Algorithm, March 2, 1971].后来,正则表达式技术从QED移植到了Unix的编辑器ed中,然后又被移植到经典的Unix工具grep中,而grpe正是由于Thompson对ed进行了彻底地修改而形成的。这些广为应用的程序使得正则表达式为早期的Unix社群所熟知。Thompson最初编写的匹配器是非常快的,因为它结合了两种独立的思想。一种思想是在匹配过程中动态地生成机器指令,这样就可以以机器指令执行的速度而不是解释执行的速度来运行。另一种思想是在每个阶段中都尽可能地执行匹配操作,这样无需回朔(backtrack)就可以查找可能的匹配。在Thompson后来编写的文本编辑器程序中,例如ed,匹配代码使用了一种更为简单的算法,这种算法将会在必要的时候进行回朔。从理论上来看,这种方法的运行速度要更慢,但在实际情况中,这种模式很少需要进行回朔,因此,ed和grep中的算法和代码足以应付大多数的情况。在后来的正则表达式匹配器中,例如egrep和fgrep等,都增加了更为丰富的正则表达式类型,并且重点是要使得匹配器无论在什么模式下都能够快速执行。功能更为强大的正则表达式正在被越来越多地使用,它们不仅被包含在用C语言开发的库中,而且还被作为脚本语言如Awk和Perl的语法的一部分。
猜您喜欢
推荐内容
开源项目推荐 更多
热门活动
热门器件
用户搜过
随便看看
热门下载
热门文章
热门标签
评论