茶亦醉人何必酒,书能香我无须花!

张帆风顺破重浪,兰幽山间心坦荡。 斌礼厚徳创伟业,志壮凌云走四方!
posts - 170, comments - 560, trackbacks - 8, articles - 4
  博客园 :: 首页 ::  :: 联系 :: 订阅 订阅 :: 管理

公告

[Regular] 4、正则表达式的匹配原理回溯

Posted on 2009-06-18 16:17 ※ABeen※ 阅读(225) 评论(0) 编辑 收藏

  NFA引擎最重要的性质就是,它会依次处理各个表达式或组合元素,遇到需要在两个可能成功的途经中进行选择的时候,它会选择其一,然后记住另一个选项,以备稍后可能的需要。一般需要做出选择的情形包括量词和多选结构。


真实世界中的面包屑
  回溯就像在道路的每个分岔口留下一小堆面包屑。如果走了死路,就可以原路返回,直到遇到面包屑标示的尚未尝试过的道路。如果还是死路,继续返回,找到下一堆面包屑,如些重复,直到找到出路,或者走完所有没有尝试过的道路。
  不论选择那一种途经,如果它能成功匹配,而且余下的正则也匹配成功了,匹配即告完成。如果余下的正则匹配失败,引擎会回溯到之前做选择时记录的备用途经。这样引擎最终会尝试表达式的所有可能途经(如果没有匹配成功的话)。

回溯的两个要点
  1、如果需要在“进行尝试”和“跳过尝试”之间选择,对于匹配优先量词,引擎会优先选择“进行尝试”,而对于忽略优先量词,会选择“跳过尝试”。
     2、在需要回溯时,距离当前最近储存的选项就是当本地失败强制回溯时返回的。使用的原则是LIFO(last in first out,后进先出)。