需求
在使用正則表達(dá)式做白名單的過程中,碰到下面的需求
匹配http://www.example.com 底下所有除了http://www.example.com/user/開頭的所有的url
比如
這時候就需要用到正則表達(dá)式的斷言。 斷言是在遍歷字符串進(jìn)行正則匹配的過程中,會在當(dāng)前字符串先進(jìn)行斷言正則的匹配,然后根據(jù)匹配結(jié)果再決定是否繼續(xù)正則表達(dá)式的匹配
斷言
斷言Assertion分為4種類型
- Look Ahead Positive Assertion
- Look Ahead Negative Assertion
- Look Behind Positive Assertion
- Look Behind Negative Assertion
前向斷言Look Ahead指的是斷言正則拿當(dāng)前位置之后的字符串進(jìn)行比較,后向斷言Look Behind拿當(dāng)前位置之前的字符串進(jìn)行比較。Positive指的是如果斷言匹配成功, 則繼續(xù)匹配過程, Negative則相反, 如果斷言匹配成功,則中斷匹配。
這4種斷言,以下面字符串開始為標(biāo)記
- Look Ahead Positive Assertion:
?=
- Look Ahead Negative Assertion:
?! - Look Behind Positive Assertion:
?<= - Look Behind Negative Assertion:
?<!
一般會放在把斷言放在一個括號中, 比如grey(?=hound), 斷言(?=hound), 正則表達(dá)式是grey,但由于斷言的存在只有grey后面跟著hound才會匹配
例子
對上面的需求,我們可以寫成如下簡單的正則進(jìn)行匹配
http://www.example.com/(?!=user/).*
真正的正則表達(dá)式是http://www.example.com/.*, 但當(dāng)遍歷到 http://www.example.com/ 的時候,它會拿下面的字符串先進(jìn)行斷言匹配,如果成功則不繼續(xù)。 http://www.example.com/user/user.html 雖然符合正則表達(dá)式,但在遍歷到 http://www.example.com/ 的時候, 它的斷言正則匹配重構(gòu),則整個匹配中斷,匹配返回false