測試數(shù)據(jù):
例如上面這幾條簡單的日志條目偎行,我們想實現(xiàn)兩個目標(biāo):
1、把8號的數(shù)據(jù)過濾掉渗常;
2汗盘、把那些不包含robots.txt字符串的條目給找出來(只要Url中包含robots.txt的都給過濾掉)。
前瞻的語法是:
(?!匹配模式)
我們先來實現(xiàn)第一個目標(biāo)——匹配不以特定字符串開頭的條目隐孽。
這里我們因為要排除一段連續(xù)的字符串健蕊,因此匹配模式非常簡單缩功,就是2009-07-08都办。實現(xiàn)如下:
^(?!2009-07-08).*?$
用Expresso我們可以看到結(jié)果確實過濾掉8號的數(shù)據(jù)。
接下來势木,我們來實現(xiàn)第二個目標(biāo)——排除包含特定字符串的條目歌懒。
按照我們上面寫法,我照葫蘆畫瓢了一下:
^.*?(?!robots\.txt).*?$
這段正則用大白話描述就是:開頭任意字符甫男,然后后面不要跟著robots.txt連續(xù)字符串,然后再跟著任意個字符板驳,字符串結(jié)尾噪窘。
運行測試,結(jié)果發(fā)現(xiàn):
沒有達到我們想要的效果直砂。這是為什么呢静暂?我們給上面的正則表達式加上兩個捕獲分組調(diào)試一下:
^(.*?)(?!robots\.txt)(.*?)$
測試結(jié)果:
我們看到谱秽,第一個分組啥都沒有匹配到,而第二個分組卻匹配了整個字符串郊供。再回過頭來好好分析一下剛才那個正則表達式近哟。
實際上,當(dāng)正則引擎解析到A區(qū) 域的時候,就已經(jīng)開始執(zhí)行B區(qū)域的前瞻工作地来。這個時候發(fā)現(xiàn)當(dāng)A區(qū)域為Null的時候匹配成功——.*本來就允許匹配空字符熙掺,前瞻條件又滿足,A區(qū)域后面緊 跟著的是“2009”字符串蜡秽,而并不是robots类浪。因此整個匹配過程成功匹配到所有條目。
分析出原因之后我們對上述的正則進行修正,將.*?移入前瞻表達式川队,如下:
^(?!.*?robots).*$
測試結(jié)果:
更多java技術(shù)文章,請訪問PHP中文網(wǎng)的java學(xué)習(xí)教程欄目眠蚂!