做日志分析工作的經常需要跟成千上萬的日志條目打交道,為了在龐大的數據量中找到特定模式的數據,常常需要編寫很多復雜的html' target='_blank'>正則表達式。例如枚舉出日志文件中不包含某個特定字符串的條目,找出不以某個特定字符串打頭的條目,等等。
?
正則表達式中有前瞻(Lookahead)和后顧(Lookbehind)的概念,這兩個術語非常形象的描述了正則引擎的匹配行為。需要注意一點,正則表達式中的前和后和我們一般理解的前后有點不同。一段文本,我們一般習慣把文本開頭的方向稱作“前面”,文本末尾方向稱為“后面”。但是對于正則表達式引擎來說,因為它是從文本頭部向尾部開始解析的(可以通過正則選項控制解析方向),因此對于文本尾部方向,稱為“前”,因為這個時候,正則引擎還沒走到那塊,而對文本頭部方向,則稱為“后”,因為正則引擎已經走過了那一塊地方。
?
所謂的前瞻就是在正則表達式匹配到某個字符的時候,往“尚未解析過的文本”預先看一下,看是不是符合/不符合匹配模式,而后顧,就是在正則引擎已經匹配過的文本看看是不是符合/不符合匹配模式。符合和不符合特定匹配模式我們又稱為肯定式匹配和否定式匹配。
現代高級正則表達式引擎一般都支持都支持前瞻,對于后顧支持并不是很廣泛,因此我們這里采用否定式前瞻來實現我們的需求。
?
第一個分組啥都沒有匹配到,而第二個分組卻匹配了整個字符串。再回過頭來好好分析一下剛才那個正則表達式。實際上,當正則引擎解析到A區域的時候,就已經開始執行B區域的前瞻工作。這個時候發現當A區域為Null的時候匹配成功――.*本來就允許匹配空字符,前瞻條件又滿足,A區域后面緊跟著的是“2009”字符串,而并不是robots。因此整個匹配過程成功匹配到所有條目。
?
將.*?移入前瞻表達式
?
?
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
新聞熱點
疑難解答