正则表达式匹配原理
表达式的匹配原理Created Friday 02 August 2013 优先选择最左端的匹配结果起始位置最靠左的匹配总是优先于其他可能的匹配结果。这条规则并没有规定优先的匹配结果的长度,只是规定在所有可能的匹配结果中,优先选择开始位置最左端的。实际上,因为可能有多个匹配结果的起始位置都在最左端,也许我们应该把这条规则中的“某个匹配结果”改为“该匹配结果”。 正则引擎中的零件分为几类:文字字符(literal character)、量词(qualifiers)、字符组(character classes)和括号等等。 标准量词是匹配优先的标准匹配量词(?、*、+以及{min,max})都是匹配优先的。它们总是希望获得最长的匹配。匹配优先量词之所以得名,是因为它们总是或尝试匹配多余匹配成功下限的字符。 NFA:表达式主导如果表达式不匹配,引擎就会尝试另一种可能,如此继续下去,直到匹配成功或是报告失败。表达式中的控制权在不同的元素之前转换,所以称为表达式主导。 DFA:文本主导与表达式主导的NFA不同,DFA引擎扫描字符串时,会记录“当前有效”的所有匹配可能。它扫描字符串中的每个字符都对引擎进行了控制。在本例中,某个未完成的匹配也许是任意多个匹配的开始,不合适的匹配能在扫描后继文字时被除去。 回溯的两个要点1.面对众多选择时哪个分支应当首先选择?如果需要在“进行尝试”和“跳过尝试”之间选择,对于优先匹配量词,引擎会优先选择“进行尝试”,而对于忽略优先量词,会选择“跳过尝试”。 2.回溯进行时,应该选取哪个保存的状态?距离当前最近存储的选项就是当本地失败强制回溯时返回的。使用的原则是LIFO(last in first out)。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |