正则表达式匹配原理
正則表達(dá)式匹配原理:
本章節(jié)將會(huì)簡(jiǎn)單的介紹一下正則表達(dá)式匹配原理,這將有助于書(shū)寫(xiě)更為有效率的正則表達(dá)式,而不僅僅能夠完成匹配任務(wù)。
一.關(guān)于正則表達(dá)式引擎:
正則引擎大體上可分為不同的兩類(lèi):DFA和NFA。
1.DFA是Deterministic finite automaton的縮寫(xiě),確定型有窮自動(dòng)機(jī)。
2.NFA是Non-deterministic finite automaton的縮寫(xiě),非確定型有窮自動(dòng)機(jī)。NFA又可以分為兩類(lèi):
1): Traditional NFA,傳統(tǒng)型非確定有窮自動(dòng)。
2): POSIX NFA,符合標(biāo)準(zhǔn)的非確定型有窮自動(dòng)機(jī)。
DFA引擎不需要進(jìn)行回溯,所以匹配效率一般情況下要高,但是它并不支持捕獲組,于是也就不支持反向引用和$這種形式的引用。
POSIX NFA是指符合POSIX 標(biāo)準(zhǔn)的NFA引擎,它的主要特點(diǎn)是提供longest-leftmost匹配,也就是說(shuō)在找到最左側(cè)最長(zhǎng)匹配之前,它將繼續(xù)回溯,此種引擎對(duì)非貪婪模式不支持。
當(dāng)前大多數(shù)語(yǔ)言都是使用傳統(tǒng)型NFA正則引擎,因?yàn)樗鼮閺?qiáng)大靈活。
二.字符串的組成:
想要真正理解正則表達(dá)式的匹配原理,那么首先就要知道在正則表達(dá)式眼中,字符串是由哪些成分構(gòu)成的,圖示如下:
上面的圖片得出,字符串不但由字符組成,還包括字符之間的位置。對(duì)于字符串"antzone"而言,它是由7個(gè)字符和8個(gè)位置構(gòu)成。
三.零寬和占有字符表達(dá)式:
在正則表達(dá)式中,如果子表達(dá)式匹配到的是字符內(nèi)容,而非位置,并且會(huì)被保存到匹配結(jié)果中,那么這個(gè)子表達(dá)式是占有字符的。如果子表達(dá)式匹配的是位置,或者匹配的內(nèi)容不被保存在最終結(jié)果中,那么就認(rèn)為這個(gè)子表達(dá)式是零寬的。
占有字符是互斥的,零寬度是非互斥的。也就是一個(gè)字符,同一時(shí)間只能由一個(gè)子表達(dá)式匹配,而一個(gè)位置,卻可以同時(shí)由多個(gè)零寬度的子表達(dá)式匹配。
注意:這里所說(shuō)的子表達(dá)式并非只有用小括號(hào)括起來(lái)的表達(dá)式,而是正則表達(dá)式中的任意匹配單元。
四.控制權(quán)的傳動(dòng):
正則表達(dá)式當(dāng)開(kāi)始匹配的時(shí)候,一般是由一個(gè)子表達(dá)式獲取控制權(quán),從字符串中的某一個(gè)位置開(kāi)始嘗試匹配,一個(gè)子表達(dá)式開(kāi)始嘗試匹配的位置,是從前一子表達(dá)匹配成功的結(jié)束位置開(kāi)始的,看下面的例子:
(子表達(dá)式一)(子表達(dá)式二)
如果子表達(dá)式一是零寬度的,那么它的匹配起始位置和結(jié)束位置是同一個(gè)位置,如果位置是0,那么子表達(dá)式二將從位置0進(jìn)行匹配。
如果子表達(dá)式一是占有字符的,開(kāi)始匹配位置0,結(jié)束匹配位置是4,那么子表達(dá)式二的開(kāi)始匹配位置就是4。
五.正則表達(dá)式匹配分解:
分解演示一:
1.將要進(jìn)行匹配的字符串:"antzone"。
2.正則表達(dá)式:/zone/。
匹配過(guò)程如下:
首先由正則表達(dá)式中字符"z"取得控制權(quán),然后去嘗試匹配字符串中的第一個(gè)字符"a",匹配失敗,則繼續(xù)嘗試第二個(gè)字符"n"依然會(huì)失敗,直到字符"z",匹配成功,這樣控制權(quán)由正則表達(dá)式中的字符"z"傳遞給字符"o",由于字符"z"已經(jīng)被匹配,所以字符"o"將會(huì)從位置4開(kāi)始匹配,由"o"來(lái)匹配"o",匹配成功,這樣依次傳遞下去,最終正則表達(dá)式匹配成功,匹配結(jié)果為"zone"。
實(shí)例如下:
var str="antzone"; var reg=/zone/; console.log(str.match(reg));
分解演示二:
1.將要進(jìn)行匹配的字符串:"antzone"。
2.正則表達(dá)式:/an?t/。
匹配過(guò)程如下:
首先由正則表達(dá)式中的元字符取得控制權(quán),開(kāi)始去嘗試匹配字符串"antzone",它匹配的是單詞邊界位置,匹配成功后,控制權(quán)交給正則表達(dá)式字符"a",由于""是零寬的,所以"a"從位置0開(kāi)始匹配,匹配字符"a"成功,然后將控制權(quán)交給"n?",由于“?”是匹配優(yōu)先量詞(同時(shí)記錄一個(gè)備選狀態(tài),如果匹配不成功則進(jìn)行回溯),所以會(huì)先嘗試進(jìn)行匹配,能夠成功"n",控制權(quán)然后交給字符"t",也能夠匹配成功,匹配結(jié)果為:"ant"。
實(shí)例如下:
var str="antzone"; var reg=/an?t/; console.log(str.match(reg));
總結(jié)
- 上一篇: 《大侠立志传》破庙攻略一览
- 下一篇: Sanic官翻-部署