正则表达式——匹配原理

  在固定字符串的处理上,正则表达式的速度是赶不上简单字符串处理的;如果要进行复杂多变得字符串处理,正则表达式的速度则要胜于简单的字符串处理,比如正则表达式a(bb)+a,它能匹配的字符串是abbaabbbbaabbbbbba···,如果用简单的字符串匹配速发,我们可能西药逐个寻找可能的形态,也就说abbaabbbbaabbbbbba···,此类尝试不知道要多少次,效率自然大打折扣。这不免让人好奇,正则表达式为什么这样快呢?要弄清这个问题,必须详细了解正则表达式的匹配原理。

8.1 有穷自动机

  正则表达式能迅速进行复杂处理的秘密就在于,它采用了一种特俗的理论模型:有穷自动机(Finite Automata,也叫有穷状态自动机,finite-state machine)。这种机器具备有宪哥状态,可以根据不同的条件在状态之间转移。

  卖饮料的自动售货机就是一种有穷自动机:假设其中的饮料价格都是整数元,而且只接收5块钱的纸币,根据余额的不同,可能状态有6个:5元、4元、3元、2元、1元、0元。你塞进去5块钱,此时的状态就是“5元”,你点了一罐可乐,花去3元,于是状态切换到“2元”,这时候你按下“退币”,就把剩下的2元退给你,并把状态切换到“0元”,“0元”这个状态也叫做“最终状态”。到此,这一轮状态转移结束,如果你再塞5块钱,就开始新一轮的状态转移。

  严格说起来,有穷自动机必须满足4个条件:

  1. 具有优先多个状态;
  2. 有一套状态转移函数(或者叫“规则”);
  3. 有一个开始状态;
  4. 有一个或多个最终状态;

  我们说自动售货机是一种有穷自动机,就是因为它满足这4个条件:

  1. 具有优先多个状态(6个);
  2. 有一套状态转移函数(比如余额还有3元,你买了一罐2元的饮料,则转移状态“1元”,如果你选择买4元的饮料,则报告“余额不足”,状态并不变化);
  3. 有一个开始状态(余额“5元”);
  4. 有一个最终状态(余额“0元”)。

  自动售货机对应的有穷自动机模型,它包含6个状态,对应余额的6种可能,起始状态是“¥5”,结束状态是“¥0”,梦儿箭头代表一个转移函数(每样商品的价格为1元或者2元,所以么个转义函数上的文字或者是-2),在¥4、¥3、¥2、¥1状态下,都可以自动直接退币,所以有一个转移函数直达最终状态。
  自动售货机并不关心你买了什么商品,也不关心你的选择顺序,无论你买了什么,它总处在这6个状态之一,只需要根据状态转移函数在其中转移即可。

posted @ 2018-12-17 18:37  gaara724  阅读(511)  评论(0编辑  收藏  举报