[Regular] 4、正则表达式的匹配原理回溯
NFA引擎最重要的性质就是,它会依次处理各个表达式或组合元素,遇到需要在两个可能成功的途经中进行选择的时候,它会选择其一,然后记住另一个选项,以备稍后可能的需要。一般需要做出选择的情形包括量词和多选结构。
真实世界中的面包屑
回溯就像在道路的每个分岔口留下一小堆面包屑。如果走了死路,就可以原路返回,直到遇到面包屑标示的尚未尝试过的道路。如果还是死路,继续返回,找到下一堆面包屑,如些重复,直到找到出路,或者走完所有没有尝试过的道路。
不论选择那一种途经,如果它能成功匹配,而且余下的正则也匹配成功了,匹配即告完成。如果余下的正则匹配失败,引擎会回溯到之前做选择时记录的备用途经。这样引擎最终会尝试表达式的所有可能途经(如果没有匹配成功的话)。
回溯的两个要点
1、如果需要在“进行尝试”和“跳过尝试”之间选择,对于匹配优先量词,引擎会优先选择“进行尝试”,而对于忽略优先量词,会选择“跳过尝试”。
2、在需要回溯时,距离当前最近储存的选项就是当本地失败强制回溯时返回的。使用的原则是LIFO(last in first out,后进先出)。