很久沒有VCKbase發表文章了,這次發表一些比較基礎的文章吧!看過" 保證你現在和未來不失業的十種關鍵技術"這篇文章了吧,這次我就拿出一 個不會讓你失業的編程技術講講吧,老蝦們千萬不要拿雞蛋砸我,我只是寫給初 學者的!
關於正則表達式的教程和用法網上有很多的資源,基本的用法 我講了也是浪費你的眼力,所以我會以一個實例來教你學習正則表達式,我兩年 前做的一個MIS中使用過正則式,檢驗用戶輸入的日期是否為正確的日期格式! 分析完這個正則表達式後,對於正則表達式你絕對會有一個深深的認識!但是還 不能說你精通,當你可能用正則表達式寫一個編譯器的時候,你就可以精通了!
“磨刀不誤砍柴工”,要使用正則表達式,我們還要使用支 持正則表達式的語言,解釋性語言Ruby,Perl,Python等都支持正則表達式, C#,Java,VB.net等也支持正則表達式,C++還需要第三方類庫才能支持,VC.net 提供了一個很好的正則表達式類庫CATLRegExp(全世界效率最高的正則表達式庫 哦),可是卻不能在VC6上使用,要在VC6上使用,可以使用VBS(Microsoft VBScript Regular Expression 5.5)來處理正則表達式,這是一個COM,拿一個 COM來用我還是情願用Boost庫.
使用Boost庫的時候,你需要編譯庫後你 才能使用,不過這很容易。
1.下載Boost庫
3.設定環境變量(以我 本機的環境變量設定為例)
2.進 入boost_1_32_0\libs\regex\build目錄中,你可以看到vc6.mak文件 nmake vc6.mak就可以了,跟著會 產生lib和dll文件,把它拷貝到你的程序目錄下就可使用了!
你也可以全 部編譯,不過我只需要正則表達式庫,所以我只編譯這部分!
好了,砍柴 刀磨好了!我們就開始正則表達式的實踐吧!
當時我負責的MIS是醫院的 一個血液檢驗輸入模塊,要求輸入的日期必須是合法的,這是第一要求,不然檢 驗單就會報廢。輸入日期是可以2006.04.02 或 2006/04/02 或 2006.4.2 或 2006/4/2 的格式,而且日期還是要合法的,比如說不可以出現 2006.02.31, 2006.4.41 這樣的日期,不排除輸入人員工作繁記忙輸入錯誤會出現這種情況。
好了,用正則表達式如何解決這個問題,首先正則表達式是一個對文本 匹配模式的使用方法,記得正則表達式的關鍵字用法是沒有用的,各種語言的正 則表達式中的關鍵字用法是不同的,要認識文本中字符的模式.比如說對以上日 期的表示可以用正則表達式表示為
"^\\d{4}[\\s\\.-/]\\d{1,2}[\\s\\.-/]\\d{1,2}$"
但這是完全錯誤的,用文字對這句正則表達式的 描述為字符串是由三組數字組成,每一組由四個數組成,第二和第三組由一個或 兩個數字組成,中間帶有空格或"/",4003.9/12,3344.0.40 都會被判 為合法的字符,這就是錯誤的用法!有什麼或以判別呢!
有閏日的年份叫 閏年,一般年份365天,閏年為366天(二月則有29天),閏年的計算方法:公元紀 年的年數可以被四整除,即為閏年;被100整除而不能被400整除為平年;被100 整除也可被400整除的為閏年.則這樣我們可以這樣設計正則表達式,第一個是要 求其格式統一,第二個是要求其能正確表達閏年!1000/2/29 合法, 2000/2/29 合法,1900/2/29 非法.
想一想,一年中不論閏年或平年有的月份都是固 定的,1,3,5,7,8,10,12月都是 31天, 4, 6, 9, 11 月都是30 天, 2 月 可能為 28 或 29天,我們則可以這樣判斷,除 2 月外, 1 到 12 月中日期為 29, 30 天內的都為合法,1,3,5,7,8,10,12月為31天的都為合法, 1 月到 12 月為 28 天的都為合法, 剩下的只要判斷當年是否為閏年就行了,是閏年 2月29 日就合法,否則非法!!!
呵,結果就出來了,用"或"把三條正 則表達式組合起來就行了,第一條是判斷除2月外日期的表達式,第二條是1到12 月都是1-28天的表達式,最後一條是判斷是否閏年及合法2月的表達式,若符合其 中一條的都為正確的日期.
第一條可以這樣寫除 2 月外 1 到 12 月都為 30 天的表達式為 (?:0?[1,3-9]|1[0-2])-(?:29|30)
除2 月外 1,3,5 ,7,8,10,12月都是 31天, ((?:0?[13578]|1[02])-31), 兩條合並起來就是 :
(?:(?:0?[1,3-9]|1[0-2])-(?:29|30)|((?:0?[13578]|1[02])- 31))
第二條可以這樣寫 (?:0?[1-9]|1[0-2])-(?:0?[1-9]|1\d|2[0-8])
第三條表達式就是要求表示閏年了,能被4 整除的四位數是怎麼組成 的呢? 可以看出,四位數中最後兩位能被四整除都可以得出這個四位數能被4整除 ,100內為4的倍數的值為04,08,12,16,20,24,28,32,36,40,44,48,52,56, 60,64,68,72,76,80,84,88,92,96,能被100與400整除的四位數則可以 為##00的形式了
則這樣的閏年判別可以為:
(\d\d(?:0[48]| [2468][048]|[13579][26]))與 (?:0[48]00|[2468][048]00|[13579][26]00)
合並後再加入2月日期合並為:
((?:(\d\d(?:0[48]|[2468] [048]|[13579][26]))|(?:0[48]00|[2468][048]00|[13579][26]00))-0?2-29)
這樣就可得出一條正確的表達式了:
^(?:([0-9]{4}-(?:(?:0?[1,3-9]|1[0-2])-(?:29|30)|((?:0?[13578]|1[02])-31)))|
([0-9]{4}-(?:0?[1-9]|1[0-2])-(?:0?[1-9]|1\d|2[0-8]))|(((?:(\d\d(?:0[48]|[2468][048]|
[13579][26]))|(?:0[48]00|[2468][048]00|[13579][26]00))-0?2-29)))$
這條表達式匹配的日期為2004-02-29,2004-2-29,不 匹配2007-2-29,格式固定為####-##-##,只有輸入日期正確了才會匹配。
這樣 就完成一條正則表達式了,不要被嚇倒,當你對正則表達式理解越深刻的時候, 你才發現它的優美!
在平時的工作中,你可以把一些常用的正則表達式封 裝成dll,當使用的時候,你可以方便地調用,提高你的效率!
這兒我順 便給出一些常用的正則表達!
合法Email的表達式
^([a-zA-Z0-9_\-])([a-zA-Z0-9_\-\.]*)@(\[((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}|
((([a-zA-Z0-9\-]+)\.)+))([a-zA-Z]{2,}|
(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\])$
合法時間表示 表達式[1:00 AM], [12:00 PM], [1:00am]
^(1|01|2|02|3|03|4|04|5|05|6|06|7|07|8|08|9|09|10|11|12{1,2}):(([0-5]{1}[0-9]{1}\s{0,1})
([AM|PM|am|pm]{2,2}))\W{0}$
網站連接:
[http://207.68.172.254/home.ashx], [ftp://ftp.netscape.com/], [https://www.brinkster.com/login.asp]
^((https?|ftp)\://((\[?(\d{1,3}\.){3}\d{1,3}\]?)|(([-a-zA-Z0-9]+\.)+[a-zA-Z]{2,4}))
(\:\d+)?(/[-a-zA-Z0-9._?,''+&%$#=~\\]+)*/?)$
本文配套源碼