Sung in Blog

                     一些技術(shù)文章 & 一些生活雜碎
          如果我們問(wèn)那些UNIX系統(tǒng)的愛(ài)好者他們最喜歡什么,答案除了穩(wěn)定的系統(tǒng)和可以遠(yuǎn)程啟動(dòng)之外,十有八九的人會(huì)提到正則表達(dá)式;如果我們?cè)賳?wèn)他們最頭痛的是什么,可能除了復(fù)雜的進(jìn)程控制和安裝過(guò)程之外,還會(huì)是正則表達(dá)式。那么正則表達(dá)式到底是什么?如何才能真正的掌握正則表達(dá)式并正確的加以靈活運(yùn)用?本文將就此展開介紹,希望能夠?qū)δ切┛释私夂驼莆照齽t表達(dá)式的讀者有所助益。

          入門簡(jiǎn)介

            簡(jiǎn)單的說(shuō),正則表達(dá)式是一種可以用于模式匹配和替換的強(qiáng)有力的工具。我們可以在幾乎所有的基于UNIX系統(tǒng)的工具中找到正則表達(dá)式的身影,例如,vi編輯器,Perl或PHP腳本語(yǔ)言,以及awk或sed shell程序等。此外,象JavaScript這種客戶端的腳本語(yǔ)言也提供了對(duì)正則表達(dá)式的支持。由此可見(jiàn),正則表達(dá)式已經(jīng)超出了某種語(yǔ)言或某個(gè)系統(tǒng)的局限,成為人們廣為接受的概念和功能。

            正則表達(dá)式可以讓用戶通過(guò)使用一系列的特殊字符構(gòu)建匹配模式,然后把匹配模式與數(shù)據(jù)文件、程序輸入以及WEB頁(yè)面的表單輸入等目標(biāo)對(duì)象進(jìn)行比較,根據(jù)比較對(duì)象中是否包含匹配模式,執(zhí)行相應(yīng)的程序。

            舉例來(lái)說(shuō),正則表達(dá)式的一個(gè)最為普遍的應(yīng)用就是用于驗(yàn)證用戶在線輸入的郵件地址的格式是否正確。如果通過(guò)正則表達(dá)式驗(yàn)證用戶郵件地址的格式正確,用戶所填寫的表單信息將會(huì)被正常處理;反之,如果用戶輸入的郵件地址與正則表達(dá)的模式不匹配,將會(huì)彈出提示信息,要求用戶重新輸入正確的郵件地址。由此可見(jiàn)正則表達(dá)式在WEB應(yīng)用的邏輯判斷中具有舉足輕重的作用。

          基本語(yǔ)法

            在對(duì)正則表達(dá)式的功能和作用有了初步的了解之后,我們就來(lái)具體看一下正則表達(dá)式的語(yǔ)法格式。

            正則表達(dá)式的形式一般如下:

            /love/

            其中位于“/”定界符之間的部分就是將要在目標(biāo)對(duì)象中進(jìn)行匹配的模式。用戶只要把希望查找匹配對(duì)象的模式內(nèi)容放入“/”定界符之間即可。為了能夠使用戶更加靈活的定制模式內(nèi)容,正則表達(dá)式提供了專門的“元字符”。所謂元字符就是指那些在正則表達(dá)式中具有特殊意義的專用字符,可以用來(lái)規(guī)定其前導(dǎo)字符(即位于元字符前面的字符)在目標(biāo)對(duì)象中的出現(xiàn)模式。

            較為常用的元字符包括: “+”, “*”,以及 “?”。其中,“+”元字符規(guī)定其前導(dǎo)字符必須在目標(biāo)對(duì)象中連續(xù)出現(xiàn)一次或多次,“*”元字符規(guī)定其前導(dǎo)字符必須在目標(biāo)對(duì)象中出現(xiàn)零次或連續(xù)多次,而“?”元字符規(guī)定其前導(dǎo)對(duì)象必須在目標(biāo)對(duì)象中連續(xù)出現(xiàn)零次或一次。

            下面,就讓我們來(lái)看一下正則表達(dá)式元字符的具體應(yīng)用。

            /fo+/

            因?yàn)樯鲜稣齽t表達(dá)式中包含“+”元字符,表示可以與目標(biāo)對(duì)象中的 “fool”, “fo”, 或者 “football”等在字母f后面連續(xù)出現(xiàn)一個(gè)或多個(gè)字母o的字符串相匹配。

            /eg*/

            因?yàn)樯鲜稣齽t表達(dá)式中包含“*”元字符,表示可以與目標(biāo)對(duì)象中的 “easy”, “ego”, 或者 “egg”等在字母e后面連續(xù)出現(xiàn)零個(gè)或多個(gè)字母g的字符串相匹配。

            /Wil?/

            因?yàn)樯鲜稣齽t表達(dá)式中包含“?”元字符,表示可以與目標(biāo)對(duì)象中的 “Will”, 或者 “Wilson”,等在字母i后面連續(xù)出現(xiàn)零個(gè)或一個(gè)字母l的字符串相匹配。

            除了元字符之外,用戶還可以精確指定模式在匹配對(duì)象中出現(xiàn)的頻率。例如,

            /jim{2,6}/

            上述正則表達(dá)式規(guī)定字符m可以在匹配對(duì)象中連續(xù)出現(xiàn)2-6次,因此,上述正則表達(dá)式可以同jimmy或jimmmmmy等字符串相匹配。

            在對(duì)如何使用正則表達(dá)式有了初步了解之后,我們來(lái)看一下其它幾個(gè)重要的元字符的使用方式。

            s:用于匹配單個(gè)空格符,包括tab鍵和換行符;

            S:用于匹配除單個(gè)空格符之外的所有字符;

            d:用于匹配從0到9的數(shù)字;

            w:用于匹配字母,數(shù)字或下劃線字符;

            W:用于匹配所有與w不匹配的字符;

            . :用于匹配除換行符之外的所有字符。

            (說(shuō)明:我們可以把s和S以及w和W看作互為逆運(yùn)算)
          下面,我們就通過(guò)實(shí)例看一下如何在正則表達(dá)式中使用上述元字符。

            /s+/

            上述正則表達(dá)式可以用于匹配目標(biāo)對(duì)象中的一個(gè)或多個(gè)空格字符。

            /d000/

            如果我們手中有一份復(fù)雜的財(cái)務(wù)報(bào)表,那么我們可以通過(guò)上述正則表達(dá)式輕而易舉的查找到所有總額達(dá)千元的款項(xiàng)。

            除了我們以上所介紹的元字符之外,正則表達(dá)式中還具有另外一種較為獨(dú)特的專用字符,即定位符。定位符用于規(guī)定匹配模式在目標(biāo)對(duì)象中的出現(xiàn)位置。

            較為常用的定位符包括: “^”, “$”, “” 以及 “B”。其中,“^”定位符規(guī)定匹配模式必須出現(xiàn)在目標(biāo)字符串的開頭,“$”定位符規(guī)定匹配模式必須出現(xiàn)在目標(biāo)對(duì)象的結(jié)尾,定位符規(guī)定匹配模式必須出現(xiàn)在目標(biāo)字符串的開頭或結(jié)尾的兩個(gè)邊界之一,而“B”定位符則規(guī)定匹配對(duì)象必須位于目標(biāo)字符串的開頭和結(jié)尾兩個(gè)邊界之內(nèi),即匹配對(duì)象既不能作為目標(biāo)字符串的開頭,也不能作為目標(biāo)字符串的結(jié)尾。同樣,我們也可以把“^”和“$”以及“”和“B”看作是互為逆運(yùn)算的兩組定位符。舉例來(lái)說(shuō):

            /^hell/

            因?yàn)樯鲜稣齽t表達(dá)式中包含“^”定位符,所以可以與目標(biāo)對(duì)象中以 “hell”, “hello”或 “hellhound”開頭的字符串相匹配。

            /ar$/

            因?yàn)樯鲜稣齽t表達(dá)式中包含“$”定位符,所以可以與目標(biāo)對(duì)象中以 “car”, “bar”或 “ar” 結(jié)尾的字符串相匹配。

            /bom/

            因?yàn)樯鲜稣齽t表達(dá)式模式以“”定位符開頭,所以可以與目標(biāo)對(duì)象中以 “bomb”, 或 “bom”開頭的字符串相匹配。

            /man/

            因?yàn)樯鲜稣齽t表達(dá)式模式以“”定位符結(jié)尾,所以可以與目標(biāo)對(duì)象中以 “human”, “woman”或 “man”結(jié)尾的字符串相匹配。

            為了能夠方便用戶更加靈活的設(shè)定匹配模式,正則表達(dá)式允許使用者在匹配模式中指定某一個(gè)范圍而不局限于具體的字符。例如:

            /[A-Z]/

            上述正則表達(dá)式將會(huì)與從A到Z范圍內(nèi)任何一個(gè)大寫字母相匹配。

            /[a-z]/

            上述正則表達(dá)式將會(huì)與從a到z范圍內(nèi)任何一個(gè)小寫字母相匹配。

            /[0-9]/

            上述正則表達(dá)式將會(huì)與從0到9范圍內(nèi)任何一個(gè)數(shù)字相匹配。

            /([a-z][A-Z][0-9])+/

            上述正則表達(dá)式將會(huì)與任何由字母和數(shù)字組成的字符串,如 “aB0” 等相匹配。這里需要提醒用戶注意的一點(diǎn)就是可以在正則表達(dá)式中使用 “()” 把字符串組合在一起。“()”符號(hào)包含的內(nèi)容必須同時(shí)出現(xiàn)在目標(biāo)對(duì)象中。因此,上述正則表達(dá)式將無(wú)法與諸如 “abc”等的字符串匹配,因?yàn)椤癮bc”中的最后一個(gè)字符為字母而非數(shù)字。

            如果我們希望在正則表達(dá)式中實(shí)現(xiàn)類似編程邏輯中的“或”運(yùn)算,在多個(gè)不同的模式中任選一個(gè)進(jìn)行匹配的話,可以使用管道符 “|”。例如:

            /to|too|2/

            上述正則表達(dá)式將會(huì)與目標(biāo)對(duì)象中的 “to”, “too”, 或 “2” 相匹配。

            正則表達(dá)式中還有一個(gè)較為常用的運(yùn)算符,即否定符 “[^]”。與我們前文所介紹的定位符 “^” 不同,否定符 “[^]”規(guī)定目標(biāo)對(duì)象中不能存在模式中所規(guī)定的字符串。例如:

            /[^A-C]/

            上述字符串將會(huì)與目標(biāo)對(duì)象中除A,B,和C之外的任何字符相匹配。一般來(lái)說(shuō),當(dāng)“^”出現(xiàn)在 “[]”內(nèi)時(shí)就被視做否定運(yùn)算符;而當(dāng)“^”位于“[]”之外,或沒(méi)有“[]”時(shí),則應(yīng)當(dāng)被視做定位符。

            最后,當(dāng)用戶需要在正則表達(dá)式的模式中加入元字符,并查找其匹配對(duì)象時(shí),可以使用轉(zhuǎn)義符“”。例如:

            /Th*/

            上述正則表達(dá)式將會(huì)與目標(biāo)對(duì)象中的“Th*”而非“The”等相匹配。
          使用實(shí)例

            在對(duì)正則表達(dá)式有了較為全面的了解之后,我們就來(lái)看一下如何在Perl,PHP,以及JavaScript中使用正則表達(dá)式。

            通常,Perl中正則表達(dá)式的使用格式如下:

            operator / regular-expression / string-to-replace / modifiers

            運(yùn)算符一項(xiàng)可以是m或s,分別代表匹配運(yùn)算和替換運(yùn)算。

            其中,正則表達(dá)式一項(xiàng)是將要進(jìn)行匹配或替換操作的模式,可以由任意字符,元字符,或定位符等組成。替換字符串一項(xiàng)是使用s運(yùn)算符時(shí),對(duì)查找到的模式匹配對(duì)象進(jìn)行替換的字符串。最后的參數(shù)項(xiàng)用來(lái)控制不同的匹配或替換方式。例如:

            s/geed/good/

            將會(huì)在目標(biāo)對(duì)象中查找第一個(gè)出現(xiàn)的geed字串,并將其替換為good。如果我們希望在目標(biāo)對(duì)象的全局范圍內(nèi)執(zhí)行多次查找—替換操作的話,可以使用參數(shù) “g”,即s/love/lust/g。

            此外,如果我們不需要限制匹配的大小寫形式的話,可以使用參數(shù) “i ”。例如,

            m/JewEL/i

            上述正則表達(dá)式將會(huì)與目標(biāo)對(duì)象中的jewel,Jewel,或JEWEL相匹配。

            在Perl中,使用專門的運(yùn)算符“=~”指定正則表達(dá)式的匹配對(duì)象。例如:

            $flag =~ s/abc/ABC/

            上述正則表達(dá)式將會(huì)把變量$flag中的字串a(chǎn)bc替換為ABC。

            下面,我們就在Perl程序中加入正則表達(dá)式,驗(yàn)證用戶郵件地址格式的有效性。代碼如下:

            #!/usr/bin/perl
            # get input
            print “What's your email address? ”;
            $email = <>
            chomp($email);
            # match and display result
            if($email =~ /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/)
            {
            print(“Your email address is correct! ”);
            }
            else
             {
              print(“Please try again! ”);
             }
          如果用戶更偏愛(ài)PHP的話,可以使用ereg()函數(shù)進(jìn)行模式匹配操作。ereg()函數(shù)的使用格式如下:
             ereg(pattern, string)

            其中,pattern代表正則表達(dá)式的模式,而string則是執(zhí)行查找替換操作的目標(biāo)對(duì)象。同樣是驗(yàn)證郵件地址,使用PHP編寫的程序代碼如下:

               if (ereg(“^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+”,$email))
              { echo “Your email address is correct!”;}
             else
              { echo “Please try again!”;}
             ?>
            最后,我們?cè)趤?lái)看一下JavaScript。JavaScript 1.2中帶有一個(gè)功能強(qiáng)大的RegExp()對(duì)象,可以用來(lái)進(jìn)行正則表達(dá)式的匹配操作。其中的test()方法可以檢驗(yàn)?zāi)繕?biāo)對(duì)象中是否包含匹配模式,并相應(yīng)的返回true或false。

            我們可以使用JavaScript編寫以下腳本,驗(yàn)證用戶輸入的郵件地址的有效性。

            
            
              < language="Javascript1.2">
              
             
             
            
            
             
             
             


            
           

          posted on 2005-10-14 22:19 Sung 閱讀(336) 評(píng)論(0)  編輯  收藏 所屬分類: software Development
          主站蜘蛛池模板: 山丹县| 雷山县| 宕昌县| 洱源县| 和顺县| 武安市| 万全县| 南木林县| 枣强县| 卓资县| 大丰市| 通州区| 察雅县| 咸宁市| 江西省| 万荣县| 楚雄市| 盐城市| 志丹县| 绥芬河市| 永宁县| 上杭县| 日喀则市| 赣州市| 丹巴县| 泽普县| 安阳市| 葵青区| 吉林省| 巨野县| 阳朔县| 祁东县| 申扎县| 盐津县| 会东县| 鹤峰县| 丰县| 宁安市| 右玉县| 南投市| 麻江县|