在固定字符串的处理上,正则表达式的速度是赶不上简单字符串处理的;如果要进行复杂多变的字符处理,正则表达式的速度则要胜于简单字符串处理,比如正则表达式a(bb)+a
,它能匹配的字符串是abba、abbbba、abbbbbba....,如果用简单的字符串匹配算法,我们可能需要逐个寻找可能的形态,此类尝试不知道要进行多少次,效率自然大打折扣。本章就是要了解正则表达式的匹配原理。
正则表达式能迅速进行复杂处理的秘密就在于,它采用了一种特殊的理论模型:有穷自动机(finite automata),也叫做有穷状态自动机(finite-state machine)。这种机器具备有限个状态,可以根据不同条件在状态之间转移。
卖饮料的自动售货机就是一种有穷自动机:假设其中的饮料价格都是整数元,而且只接受5块钱的纸币,根据余额的不同,可能状态有6个:5元、4元、3元、2元、1元、0元。你塞进去5块钱,此时的状态就是“5元”,点了一罐可乐,花去3元,于是切到状态“2元”,这时你按下退币,就把剩下的2元退给你,并把状态切换到“0元”,“0元”这个状态也叫做“最终状态”。到此,这一轮状态结束,如果你再塞5块钱,就开始新的一轮状态转移。
严格的说起来,有穷自动机必须满足4个条件:
- 具有有限多个状态
- 有一套状态转移函数(规则)
- 有一个开始状态
- 有一个或多个最终状态
我们说自动售货机是一种有穷自动机,就是因为它满足这4个条件:
- 具有有限多个状态(0-5元 六个状态)
- 有一套状态转移函数(比如越为3,买了一罐2元的饮料,则转移状态到“1元”,如果选择买4元的饮料,则提示余额不足,状态并不变化)
- 有一个开始状态(余额5元)
- 有一个或多个最终状态(余额0元)
在固定字符串的处理上,正则表达式的速度是赶不上简单字符串处理的;如果要进行复杂多变的字符处理,正则表达式的速度则要胜于简单字符串处理,比如正则表达式a(bb)+a
,它能匹配的字符串是abba、abbbba、abbbbbba....,如果用简单的字符串匹配算法,我们可能需要逐个寻找可能的形态,此类尝试不知道要进行多少次,效率自然大打折扣。本章就是要了解正则表达式的匹配原理。
正则表达式能迅速进行复杂处理的秘密就在于,它采用了一种特殊的理论模型:有穷自动机(finite automata),也叫做有穷状态自动机(finite-state machine)。这种机器具备有限个状态,可以根据不同条件在状态之间转移。
卖饮料的自动售货机就是一种有穷自动机:假设其中的饮料价格都是整数元,而且只接受5块钱的纸币,根据余额的不同,可能状态有6个:5元、4元、3元、2元、1元、0元。你塞进去5块钱,此时的状态就是“5元”,点了一罐可乐,花去3元,于是切到状态“2元”,这时你按下退币,就把剩下的2元退给你,并把状态切换到“0元”,“0元”这个状态也叫做“最终状态”。到此,这一轮状态结束,如果你再塞5块钱,就开始新的一轮状态转移。
严格的说起来,有穷自动机必须满足4个条件:
- 具有有限多个状态
- 有一套状态转移函数(规则)
- 有一个开始状态
- 有一个或多个最终状态
我们说自动售货机是一种有穷自动机,就是因为它满足这4个条件:
- 具有有限多个状态(0-5元 六个状态)
- 有一套状态转移函数(比如越为3,买了一罐2元的饮料,则转移状态到“1元”,如果选择买4元的饮料,则提示余额不足,状态并不变化)
- 有一个开始状态(余额5元)
- 有一个或多个最终状态(余额0元)
自动售货机并不关心你买了什么商品,也不关心你的选择顺序,无论你买什么,它总处在这六个状态之一,只需要根据状态转移函数在其中转移即可。每一个状态下都可以直接退币,所以有一个转移函数直达最终状态。
自动售货机并不关心你买了什么商品,也不关心你的选择顺序,无论你买什么,它总处在这六个状态之一,只需要根据状态转移函数在其中转移即可。每一个状态下都可以直接退币,所以有一个转移函数直达最终状态。