正則表達(dá)式引擎淺析
正則表達(dá)式引擎的內(nèi)部工作機(jī)制是什么呢?我們有的時候會碰到當(dāng)使用正則表達(dá)式的時候很多的結(jié)果并不是我們想要的,那么其原因是什么呢?那么這里就會給你一個答案:
了解正則表達(dá)式引擎的必要性:
知道正則表達(dá)式引擎是如何工作的有助于你很快理解為何某個正則表達(dá)式不像你期望的那樣工作。
正則表達(dá)式引擎的種類:
有兩種類型的引擎:文本導(dǎo)向(text-directed)的引擎和正則導(dǎo)向(regex-directed)的引擎。Jeffrey Friedl把他們稱作DFA和NFA引擎。本文談到的是正則導(dǎo)向的引擎。這是因為一些非常有用的特性,如“惰性”量詞(lazy quantifiers)和反向引用(backreferences),只能在正則導(dǎo)向的引擎中實現(xiàn)。所以毫不意外這種引擎是目前***的引擎。
你可以輕易分辨出所使用的引擎是文本導(dǎo)向還是正則導(dǎo)向。如果反向引用或“惰性”量詞被實現(xiàn),則可以肯定你使用的引擎是正則導(dǎo)向的。你可以作如下測試:將正則表達(dá)式<<regex|regex not>>應(yīng)用到字符串“regex not”。如果匹配的結(jié)果是regex,則引擎是正則導(dǎo)向的。如果結(jié)果是regex not,則是文本導(dǎo)向的。因為正則導(dǎo)向的引擎是“猴急”的,它會很急切的進(jìn)行表功,報告它找到的***個匹配 。
正則表達(dá)式引擎的小小總結(jié):
正則導(dǎo)向的引擎總是返回最左邊的匹配,這是需要你理解的很重要的一點:即使以后有可能發(fā)現(xiàn)一個“更好”的匹配,正則導(dǎo)向的引擎也總是返回最左邊的匹配。
當(dāng)把<<cat>>應(yīng)用到“He captured a catfish for his cat”,引擎先比較<<c>>和“H”,結(jié)果失敗了。于是引擎再比較<<c>>和“e”,也失敗了。直到第四個字符,<<c>>匹配了“c”。<<a>>匹配了第五個字符。到第六個字符<<t>>沒能匹配“p”,也失敗了。引擎再繼續(xù)從第五個字符重新檢查匹配性。直到第十五個字符開始,<<cat>>匹配上了“catfish”中的“cat”,正則表達(dá)式引擎急切的返回***個匹配的結(jié)果,而不會再繼續(xù)查找是否有其他更好的匹配。
正則表達(dá)式引擎的相關(guān)內(nèi)容就向你介紹到這里,希望你對正則表達(dá)式引擎有所了解。
【編輯推薦】