[前言:]在我們編寫WEB程序時,經常會判斷一個字符串的有效性,如;一個串是否是數字、是否是有效的Email地址等等。如果不使用
正則表達式,那麼判斷的程序會很長,並且容易出錯,如果使用正則表達式,這些判斷就是一件很輕松的工作了。本文全面介紹正則表達式的
慨念、格式。並以在PHP、ASP中的應用實例增加讀者的感性認識。正則表達式的應用很廣,需要大家在學習和實踐中不斷的總結。
正則表達式簡介
簡單的說,正則表達式是一種可以用於模式匹配和替換的強有力的工具。在網絡編程中應用廣泛,如PHP腳本語言或是Java(Java教程 Java培訓 )Script、VBScript這樣的客戶端腳本語言都提供了對正則表達式的支持。由此可見,正則表達式已經超出了某種語言或某個系統的局限,成為人們廣為接受的概念和功能。
正則表達式可以讓用戶通過使用一系列的特殊字符構建匹配模式,然後把匹配模式與數據文件、程序輸入以及WEB頁面的表單輸入等目標對象進行比較,根據比較對象中是否包含匹配模式,執行相應的程序。
舉例來說,正則表達式的一個最為普遍的應用就是用於驗證用戶在線輸入的郵件地址的格式是否正確,如果通過正則表達式驗證用戶郵件地址的格式正確,用戶所填寫的表單信息將會被正常處理;反之,如果用戶輸入的郵件地址與正則表達的模式不匹配,將會彈出提示信息,要求用戶重新輸入正確的郵件地址。由此可見正則表達式在WEB應用的邏輯判斷中具有舉足輕重的作用。在後面我們會舉例詳細介紹。正則表達式形式一般如:/love/,其中位於\"/\"定界符之間的部分就是將要在目標對象中進行匹配的模式。用戶只要把希望查找匹配對象的模式內容放入\"/\"定界符之間即可。為了能夠使用戶更加靈活的定制模式內容,正則表達式提供了專門的\"元字符\".所謂元字符就是指那些在正則表達式中具有特殊意義的專用字符,可以用來規定其前導字符(即位於元字符前面的字符)在目標對象中的出現模式。較為常用的元字符包括: \"+,\"*,?以及{}\",或者\"\\s,\\S,\\d,\\w和\\W\"等等。為了能夠方便用戶更加靈活的設定匹配模式,正則表達式允許使用者在匹配模式中利用[]界定匹配於某一個范圍的字符而不局限於具體的字符。
除了我們以上的元字符之外,正則表達式中還具有另外一種較為獨特的專用字符,即定位符。定位符用於規定匹配模式在目標對象中的出現位置。較為常用的定位符包括: \"^\", \"$\", \"\\b\" 以及 \"\\B\"。
如果我們希望在正則表達式中實現類似編程邏輯中的\"或\"運算,在多個不同的模式中任選一個進行匹配的話,可以使用管道符 \"|\"。例如:
正則表達式中還有一個較為常用的運算符,即否定符 \"[ ^ ]\"。與我們前文所提到的定位符 \"^\" 不同,否定符 \"[ ^ ]\"規定目標對象中不能存在模式中所規定的字符串。一般來說,當\"^\"出現在 \"[]\"內時就被視做否定運算符;而當\"^\"位於\"[] \"之外,或沒有\"[]\"時,則應當被視做定位符。
最後,當用戶需要在正則表達式的模式中加入元字符,並查找其匹配對象時,可以使用轉義符\"\\\"。例如:/Th\\*/,該正則表達式將會與目
標對象中的\"Th*\"而非\"The\"等相匹配。
正則表達式的語法規則和標記
現在我們正式進入則表達式的學習,我會根據實例結合講解正則表達式的用法,看完後你就會覺得寫UBB代碼如此簡單了,只要你一步一步的跟著我學 看完本文章後你就成為UBB高手了。激動人心的就是你能寫出自已的UBB標簽來了,再也不用到別人那裡去拷貝現成的代碼和模板了。 還好VBScritp5.0 給我們提供了\"正則表達式\"對象,只要你的服務器安裝了IE5.x,就可以運行了。
字符描述:
^符號匹配字符串的開頭。例如:
^abc 與\"abc xyz\"匹配,而不與\"xyz abc\"匹配
$符號匹配字符串的結尾。例如:
abc$ 與\"xyz abc\"匹配,而不與\"abc xyz\"匹配。
注意:如果同時使用^符號和$符號,將進行精確匹配。例如:
^abc$ 只與\"abc\"匹配
*符號匹配0個或多個前面的字符。例如:
ab* 可以匹配\"ab\"、\"abb\"、\"abbb\"等
+符號匹配至少一個前面的字符。例如:
ab+ 可以匹配\"abb\"、\"abbb\"等,但不匹配\"ab\"。
?符號匹配0個或1個前面的字符。例如:
ab?c? 可以且只能匹配\"abc\"、\"abbc\"、\"abcc\"和\"abbcc\"
.符號匹配除換行符以外的任何字符。例如:
(.)+ 匹配除換行符以外的所有字符串
x|y匹配\"x\"或\"y\"。例如:
abc|xyz 可匹配 \"abc\"或 \"xyz\",而\"ab(c|x)yz\"匹配 \"abcyz\"和\"abxyz\"
{n}匹配恰好n次(n為非負整數)前面的字符。例如:
a{2} 可以匹配\"aa\",但不匹配\"a\"
{n,}匹配至少n次(n為非負整數)前面的字符。例如:
a{3,} 匹配\"aaa\"、\"aaaa\"等,但不匹配\"a\"和\"aa\"。
注意:a{1,}等價於a+
a{0,}等價於a*
{m,n}匹配至少m個,至多n個前面的字符。例如:
a{1,3} 只匹配\"a\"、\"aa\"和\"aaa\"。
注意:a{0,1}等價於a?
[xyz]表示一個字符集,匹配括號中字符的其中之一。例如:
[abc] 匹配\"a\"、\"b\"和\"c\"
[^xyz]表示一個否定的字符集。匹配不在此括號中的任何字符。例如:
[^abc] 可以匹配除\"a\"、\"b\"和\"c\"之外的任何字符
[a-z]表示某個范圍內的字符,匹配指定區間內的任何字符。例如:
[a-z] 匹配從\"a\"到\"z\"之間的任何一個小寫字母字符
[^m-n]表示某個范圍之外的字符,匹配不在指定范圍內的字符。例如:
[m-n] 匹配除從\"m\"到\"n\"之間的任何字符
\\符號是轉義操作符。例如:
\\n 換行符
\\f 分頁符
\\r 回車
\\t 制表符
\\v 垂直制表符
\\\\ 匹配\"\\\"
\\/ 匹配\"/\"
\\s 任何白字符,包括空格、制表符、分頁符等。等價於\"[ \\f\\n\\r\\t\\v]\"
\\S 任何非空白的字符。等價於\"^\\f\\n\\r\\t\\v]\"
\\w 任何單詞字符,包括字母和下劃線。等價於\"[A-Za-z0-9_]\"
\\W 任何非單詞字符。等價於\"[^A-Za-z0-9_]\"
\\b匹配單詞的結尾。例如:
ve\\b 匹配單詞\"love\"等,但不匹配\"very\"、\"even\"等
\\B匹配單詞的開頭。例如:
ve\\B 匹配單詞\"very\"等,但不匹配\"love\"等
\\d匹配一個數字字符,等價於[0-9]。例如:
abc\\dxyz 匹配\"abc2xyz\"、\"abc4xyz\"等,但不匹配\"abcaxyz\"、\"abc-xyz\"等
\\D匹配一個非數字字符,等價於[^0-9]。例如:
abc\\Dxyz 匹配\"abcaxyz\"、\"abc-xyz\"等,但不匹配\"abc2xyz\"、\"abc4xyz\"等
\\NUM匹配NUM個(其中NUM為一個正整數),引用回到記住的匹配。例如:
(.)\\1 匹配兩個連續相同的字符。
\\oNUM匹配n(其中n為一個小於256的八進制換碼值)。例如:
\\o011 匹配制表符
\\xNUM匹配NUM(其中NUM為一個小於256的十六進制換碼值)。例如:
\\x41 匹配字符\"A\"
應用實例
在對正則表達式有了較為全面的了解之後,就可以在Perl,PHP,以及ASP等程式中使用正則表達式了。
下面以PHP語言為例,使用驗證用戶在線輸入的郵件地址以及網址的格式是否正確。PHP 提供了eregi()或ereg()資料處理函數實現字串比
對剖析的模式匹配操作ereg()函數的使用格式如下:
ereg (pattern, string)
其中,pattern代表正則表達式的模式;而string則是執行查找替換操作的目標對象,如Email地址值。本函式以 pattern 的規則來剖析比
對字串 string,找到則傳回值為 true。函式ereg()與eregi()的區別就是前者區分大小寫,後者與大小寫無關。使用PHP編寫的程序代碼如下:
if (ereg(\"^([a-z0-9_-])+@([a-zZ0-9_-])+(\\.[a-z0-9_-])+[a-z]{2,3}$\",$email))
{ echo \"您的 E-Mail 通過初步檢查!\";}
else
{ echo \"不是合法的E-Mail 地址,請重新輸入!\";}
?>
這個例子是可對使用者輸入的 E-Mail 作簡單的檢查,檢查使用者的 E-Mail 字串是否有 @ 字元,在 @ 字元前有小寫英文字母、數字或下\"_\",在 @ 之後有數節字串,最後的小數點後只能有二個或三個小寫英文字母。如[email protected], [email protected]就可以通過檢查,而[email protected](出現大寫字母)和[email protected](最後的小數點後只能超過3個英文字母)就不能通過檢查。
我們通過調用自定義正規則判別函式也可以進行檢查操作,如下面的網址檢驗函式:
function VerifyWebSiteAddr ($strWebSiteAddr){
return (eregi (\"^([_0-9a-z-]+.)+([0-9a-z-]+.)+[a-z]{2,3}$\", $strWebSiteAddr));
}