正則表達(dá)式中有Lookahead and Lookbehind一說,可以統(tǒng)稱為L(zhǎng)ookaround。
Lookahead包含:(?=)、(?!)
Lookbehind包含:(?<=)、(?<!)
可以看出它們倆都包含了正負(fù),即"="與"!"
Lookbehind中多了個(gè)"<",為了便于記憶,可以把"<"形象地看成"向左看"!
同樣,為了便于記憶,可以認(rèn)為:ahead是向右看,behind是向左看。 
為了便于理解,先撇開Lookaround,進(jìn)行匹配,然后再考慮它。
例如:(?<=ab)cd,我就先把它看成:cd,然后再考慮(?<=ab)
如果,我有一個(gè)正則表達(dá)式:(?<=ab)cd,判斷它能否匹配abcd、efcd。
這是一個(gè)Lookbehind,我先考慮cd,顯然cd都可以匹配abcd、efcd,但是當(dāng)我再考慮(?<=ab)時(shí),只有abcd能夠被匹配了,因?yàn)樵赼bcd中的cd前面有ab,但是efcd中的cd前面沒有ab。
同樣,我可以分析:ab(?=cd),能否匹配abcd、abef。
這是一個(gè)Lookahead,我先考慮ab,顯然ab都可以匹配abcd、abef,但是當(dāng)我再考慮(?=cd)時(shí),只有abcd能夠被匹配了,因?yàn)樵赼bcd中的ab后面有cd,但是abef中的ab后面沒有cd。
實(shí)際上,無論是Lookahead還是Lookbehind都是,從左到右進(jìn)行匹配的。
Lookahead可以像上面那樣理解;
Lookbehind其實(shí)是,先到左邊看看,是否滿足,再匹配的。但是,也可以像上面那樣理解。
經(jīng)過上述介紹,大家可能就思維定勢(shì)了,認(rèn)為L(zhǎng)ookbehind都在左邊,而Lookahead都是在右邊。
如果要我運(yùn)用Lookaround來,判斷一個(gè)單詞是否以s結(jié)尾/開頭,可能首先就會(huì)寫出:
/b/w+(?=s)/b        //以s結(jié)尾/b(?<=s)/w+/b       //以s開頭
 
不幸的是,上面兩個(gè)都是錯(cuò)的!千萬不要有思維定勢(shì),正確的是這樣的:
/b/w+(?<=s)/b       //以s結(jié)尾/b/w+(?<!s)/b       //不以s結(jié)尾/b(?=s)/w+/b        //以s開頭/b(?!s)/w+/b        //不以s開頭
 
借助于Lookaround可以寫出具有組合功能的正則表達(dá)式。
如果,你想匹配一個(gè)單詞,它滿足:
1.長(zhǎng)度為4-62.包含oo3.不以s結(jié)尾
 
可以用這樣的正則表達(dá)式來搞定:
/b(?=/w{4,6}/b)/w*oo/w*(?<!s)/b
 
它可以匹配:zooz、ooooo、xxoo等
但是不匹配:xoo、zoos、ooooooo等
如發(fā)現(xiàn)錯(cuò)誤之處,請(qǐng)大家指出!
如有更好的理解方式,請(qǐng)共享!
謝謝!
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注