• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            教你使用正則表達式

            Posted on 2008-07-22 10:13 RichardHe 閱讀(435) 評論(0)  編輯 收藏 引用 所屬分類: [再轉]

            教你使用正則表達式

            下載源代碼

            很久沒有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._?,''+&%$#=~\\]+)*/?)$

            posts - 94, comments - 138, trackbacks - 0, articles - 94

            Copyright © RichardHe

            国产成人精品久久亚洲| 久久综合综合久久综合| 久久亚洲精品中文字幕三区| 97久久久久人妻精品专区| 精品久久一区二区三区| 国产免费福利体检区久久| 久久九九久精品国产免费直播| 看久久久久久a级毛片| 97久久精品人人做人人爽| 伊人久久综合精品无码AV专区| 国产精品一区二区久久精品| 久久精品国产男包| 伊人色综合久久| 久久精品中文騷妇女内射| 午夜精品久久久久久久无码| 久久99国产精一区二区三区| 狠狠色综合网站久久久久久久高清| 久久国产精品成人免费| 日日躁夜夜躁狠狠久久AV| 久久一区二区免费播放| 色综合久久中文色婷婷| 国内精品久久久久影院日本| 久久亚洲AV成人无码| 欧洲性大片xxxxx久久久| 91精品国产色综久久| 99久久99久久精品免费看蜜桃| 伊人色综合久久天天网| 久久综合成人网| 人妻无码精品久久亚瑟影视| 国产日韩久久免费影院| 中文字幕久久欲求不满| 久久99毛片免费观看不卡| 91视频国产91久久久| 精品久久久久久无码专区| 麻豆AV一区二区三区久久| 性欧美丰满熟妇XXXX性久久久 | 麻豆一区二区99久久久久| 国内精品欧美久久精品| 亚洲精品乱码久久久久久| av无码久久久久久不卡网站| 久久久亚洲欧洲日产国码二区|