正則表達式回溯-致使CPU偏高

最近了解了下有關正則表達式回溯的內容,想一想就寫下來,方便本身。html

正則表達式匹配算法是創建在正則表達式引擎的基礎上的,目前有兩種引擎:DFA(肯定型有窮自動機)和NFA(不肯定型有窮自動機)。這兩種引擎的區別主要在於被匹配對象不一樣。正則表達式

DFA是用文本去匹配表達式。而NFA是用表達式去匹配文本。這個瞭解一下就信了。目前咱們用的是NFA自動機。算法

爲何有時候正則表達式的使用會致使CPU飆升呢?這個與正則表達式的回溯有關。什麼就正則表達式的回溯以及爲何會發生回溯呢?請看下面的例子。spa

regex="b{1,3}ac";htm

text="bbac";對象

表達式在匹配文本的時候是一個一個的去校驗。b{1,3}表示最少出現一個b,最多3個b連續出現。這樣在咱們的文本中出現了連續的兩個b,因此文本是符合這條表達式的。可是因爲NFA的貪婪特性,也就是會更多的去匹配文本。表達式會用第三個b去和文本中的所處第三位置的a去匹配,結果不符合。這樣就結束了嗎?並無,接下來表達式會在已經匹配的三個字符中「吐」出字符a,這就是回溯。而後就從表達式中的a開始逐一匹配剩餘文本ac。直到結束。blog

若是想要解決這種問題,就須要改變表達式的匹配模式。表達式有三種模式:貪婪模式、懶惰模式、獨佔模式。基礎

剛剛咱們所用到的是貪婪模式,儘量多的去匹配。co

而懶惰模式,儘量少的去匹配,但仍會發生回溯。獨佔模式,儘量多的去匹配,但不回溯。字符

那如何將表達式改成懶惰模式呢:

regex="b{1,3}?ac";

獨立模式呢?

regex="b{1,3}+ac";這種就能夠解決回溯的問題。

 

 

這些只是我的的理解,有什麼不足之處,還望指出,若是不理解的能夠參考:http://www.cnblogs.com/study-everyday/p/7426862.html。但願對你有所幫助。

相關文章
相關標籤/搜索