正則表達式之正負向預查使

引用: http://blog.csdn.net/oyiboy/archive/2005/12/04/543605.aspx
閒話:寫Blog。對我這種懶人來說,簡直就是...沒事找事作,有空不如去睡覺,不過,脫離公司後一直忙於寫程序終於發現了Blog的作用,另一 個記錄東西的硬盤,哈哈,要找以前的資料直接到自己的Blog裏找就行了,不錯呢,今天決定了。以後不定時的更新Blog,作爲記錄用。

  正文:今天記錄正則表達式的正負向預查使。
   一個問題一時困擾着我,從以前練手寫ASP的語法分析器,到後來幫朋友的採集器(小偷來着)就是:“.*?script.*?”是匹配一行中有 script的字符串,而想匹配一行中沒有script的字符串又怎麼作呢?“.*?[^script].*?”?明顯不行。[^]是不包含裏面的每個字 符。也就是隻要行裏不包含有s、c、r、i、p、t都能匹配。這個自然不是我想要的。
  突然想到,這兩天羣天太安靜了,靜得有點無聊,上去問問那些潛水高手們。很快得到指點,用“?!”,當時我楞了一下。“?!”是什麼..查Vbscript手冊,沒有這玩意。突然想起我的網文捕快裏有一篇微軟的正則表達式簡介。
  經查。“?!”叫“負向預查”(正是本文的主角之一),以下引用微軟公司的正式介紹:

(?!pattern) 負向預查,在任何不匹配Negative lookahead matches the search string at any point where a string not matching pattern 的字符串開始處匹配查找字符串。這是一個非獲取匹配,也就是說,該匹配不需要獲取供以後使用。例如'Windows(?!95|98|NT|2000)' 能匹配Windows 3.1" 中的 "Windows"但不能匹配 "Windows 2000" 中的 "Windows"。預查不消耗字符,也就是說,在一個匹配發生後,在最後一次匹配之後立即開始下一次匹配的搜索,而不是從包含預查的字符之後開始。

  而這位“負向預查”使還有一位兄弟“正向預查”使,"(?=)",以下是微軟公司對其的正式介紹信:

(?=pattern) 正向預查,在任何匹配 pattern 的字符串開始處匹配查找字符串。這是一個非獲取匹配,也就是說,該匹配不需要獲取供以後使用。例如,'Windows (?=95|98|NT|2000)' 能匹配"Windows 2000"中的"Windows",但不能匹配"Windows3 .1"中"Windows"。預查不消耗字符,也就是說,在一個匹配發生後,在最後一次匹配之後立即開始下一次匹配的搜索,而不是從包含預查的字符之後開 始。

  從上面的字面上看"?!"和"?="組合中的()起不到普通()的標記子表達式的作用,他們只是爲了配合"?!"和"?="指定範圍而出現的,如果要將匹配結果標記成子表達式存放到Matches(vbscript的正則集合)內的話需要在外向再加一層()。
  說了這麼多,回到剛剛開始的例子。“.*?script.*?”是匹配一行中包含有script的字符串,那麼其反意正則表達式就是:“.*?(?!script).*”匹配一行中不包含有script的字符串。
  小小提醒,在測試這個正則時我寫了一個正則“/n(?!script)*/n”居然會讓我的IIS卡死,CPU100%。必須重啓IIS才能恢復。原因不知,但請大家留意了。

  閒話:歡迎各位有手機的朋友到我的“海魚手機加瓦站(http://wwww.fishjava.com)”來轉轉,有不少的免費的手機遊戲和圖片提供給各位,不但可以在線試玩遊戲,直接通過WAP下載遊戲和圖片,還能自己上傳一些好玩的遊戲或圖片上來大家一起來玩。

發佈了25 篇原創文章 · 獲贊 3 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章