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