正则表达式和模式匹配简介

来源:互联网 发布:一直播软件 编辑:程序博客网 时间:2024/05/24 01:41

正则表达式和模式匹配简介

作者:张桂权

(摘自《 正则表达式袖珍手册》一书。译者,张桂权。可以从http://download.csdn.net/source/346896下载完整的译稿。如果感觉不错就去买一本原版的书吧,Regular Expression Pocket Reference,支持原书的作者。看PDF文件也是很累的。看完之后别忘了,给我提宝贵意见哦。谢谢。ajax.mailer@gmail.com)


一个正则表达式(regular expression)就是包含正常字符串和特殊元字符(metacharacters)或元序列(metasequences)的字符串。正常字符串匹配它们自己。元字符和元序列是字符或表示数量、位置或字符类型的字符序列。“正则表达式元字符、模式和结构”列表,展示了正则表达式中最通用的元字符和元序列。后面的章节中将列出正则表达式的特殊实现所支持的有效的元字符和它的语法。

 

模式匹配包括搜索由正则表达式匹配的文本一部分。搜索这个文本的核心代码叫正则表达式引擎(regular expression engine)。只要记住以下两个规则,你就可以推出绝大多数的正则表达式的结果:

 

1.       最早匹配成功(最左边的)

正则表达式应用到输入的时候是从第一个字符,并一次处理到最后一个字符。一旦正则表达式引擎找到一个匹配,就立即返回(请参看MRE 148-149)。

 

2.       标准计量器是贪婪的

计量器指定一个对象(字符、字符串)的最大可重复次数。标准的计量器千方百计想匹配所有可能的次数。如果对于匹配成功有必要那么可以将其值设置为比最大值小的数。遗漏字符和试图少贪婪匹配的处理过程叫回溯(backtracking,请参看MRE 151-153)。

      

       不同类型的正则表达式有各自不相同的特点。通常由两种类型的引擎:确定有限自动机(Deterministic Finite Automaton, DFA)和非确定有限自动机(Nondeterministic Finite Automaton, NFA)。DFA速度快,但是缺了NFA的许多特性,比如,捕获、环顾四周、非贪婪计量器。NFA有传统实现和POSIX两类。


DFA引擎

       DFAs用输入字符串的每一个字符依次和正则表达式比较,并记录这个过程中所有的匹配。由于每一字符最多只检测一次,所以DFA引擎的速度最快。DFAs的一个传统的记忆方法是它的交换是贪婪。当在一次匹配中有不止一个可选(foo|foobar)时,选择最长的一个。所以规则1可以记作“最长最左匹配成功。”(请参看MRE 155-156


传统的NFA引擎

       传统的NFA引擎用正则表达式的每一个元素跟输入字符串进行比较,并记录正则表达式中所选择的两个选项的位置。如果一个选择失败,引擎回溯到最近保存的位置。在标准计量器的作用下,引擎一般采用贪婪的选项来匹配更多的文本。然而,如果这个选项导致匹配的失败,那么引擎会返回到一个保存的位置,并尝试低贪婪度的路径。传统的NFA引擎采用顺序交换,这样交换中的每一个选项都依次进行尝试。如果前面已经找到了一个成功的匹配,那么很长的匹配可能会被忽略。所以,规则1可以称作去读“贪婪量器满足条件之后的最先最左匹配”。(请参看MRE 153-154

 

POSIX NFA引擎

       OPSIX NFA引擎的原理和传统的NFA相似,主要的一个差别是:POSIX引擎总是选择最长最左匹配。比如,交换cat | category,即使第一个交换(“cat”)已经匹配成功,而且在前面出现过,如果可能的话,仍将匹配“category”整个字。(请参看MRE 153-154

 

正则表达式元字符、模式和结构

       这里所讲的元字符和元序列表示正则表达式结构和通用语法的可用类型。然而,不同实现之间的语法和可用性差异很大。