以前就想總結一下,一直沒有時間,今天看見了一篇好文,特此貢獻出來,盡情享受正則的強大功能吧!!
以下為正文內容:
------------------------------------------------------------
正則表達式(Regular Expression)為字符串模式匹配提供了一種高效、方便的方法。幾乎所有高級語言都提供了對正則表達式的支持,或者提供了現成的代碼庫供調用。本文以ASP環境中常見的處理任務為例,介紹正則表達式的應用技巧。
一、檢驗密碼和郵件地址的格式
我們的第一個實例示范正則表達式的一項基本功能:抽象地描述任意復雜的字符串。它的意思就是,正則表達式給予程序員一種形式化的字符串描述方法,只需很少的代碼即可描述出應用遇到的任意字符串模式。例如,對於不從事技術工作的人來說,密碼格式的要求可以描述如下:密碼的第一個字符必須是字母,密碼最少4個字符且不超過15個字符,密碼不能包含除字母、數字和下劃線以外的字符。
作為程序員,我們必須把上面對密碼格式的自然語言描述轉換成其他形式,使得ASP頁面能夠理解並應用它來防止非法的密碼輸入。描述這個密碼格式的正則表達式是:^[a-zA-Z]w{3,14}$。
在ASP應用裡,我們可以把密碼驗證過程寫成可重用的函數,如下所示:
Function TestPassword(strPassword)
Dim re
Set re = new RegExp
re.IgnoreCase = false
re.global = false
re.Pattern = "^[a-zA-Z]w{3,14}$"
TestPassword = re.Test(strPassword)
End Function
下面我們把這個檢驗密碼格式的正則表達式和自然語言描述對比著看看:
密碼的第一個字符必須是字母:正則表達式描述是“^[a-zA-Z]”,其中“^”表示字符串的開始,連字符告訴RegExp匹配指定范圍的所有字符。
密碼最少4個字符且不超過15個字符:正則表達式描述是“{3,14}”。
密碼不能包含除字母、數字和下劃線以外的字符:正則表達式描述是“w”。
幾點說明:{3,14}表示前面的模式匹配至少3個、但不超過14個的字符(加上第一個字符就成了4到15個字符)。注意花括號內的語法要求極其嚴格,不允許在逗號的兩邊加入空格。如果加入了空格,它將對正則表達式的含義產生影響,導致密碼格式檢驗時產生錯誤。另外,上面的正則表達式末尾也沒有加上“$”字符。$字符使得正則表達式匹配字符串直至末尾,確保合法的密碼後面沒有加上任何其他字符。
類似於密碼格式檢驗,檢查email地址的合法性也是一個很常見的問題,用正則表達式進行簡單的email地址檢驗可以實現如下:
<%
Dim re
Set re = new RegExp
re.pattern = "^w+@[a-zA-Z_]+?.[a-zA-Z]{2,3}$"
Response.Write re.Test("[email protected]")
%>
------------------------------------------------------
二、提取HTML頁面的特定部分
從HTML頁面提取內容所面臨的主要問題是,我們必須尋找一種方法精確地識別出自己想要的那一部分內容。例如,下面是一個顯示新聞標題的HTML代碼片斷:
<table border="0" width="11%" class="Somestory">
<tr>
<td width="100%">
<p align="center">其他內容...</td>
</tr>
</table>
<table border="0" width="11%" class="Headline">
<tr>
<td width="100%">
<p align="center">伊拉克戰爭!</td>
</tr>
</table>
<table border="0" width="11%" class="Someotherstory">
<tr>
<td width="100%">
<p align="center">其他內容...</td>
</tr>
</table>
觀察上述代碼,很容易看出新聞標題由位於中間的表格顯示,它的class屬性設置為Headline。如果HTML頁面非常復雜,使用Microsoft IE從5.0開始提供的一項附加功能可以只查看被選中部分頁面的HTML代碼,請訪問http://www.microsoft.com/Windows/ie/WebAccess/default.ASP了解詳情。對於本例,我們假定這是唯一class屬性設置為Headline的表格。現在我們要創建正則表達式,通過正則表達式找到這個Headline表格並把這個表格包含到自己的頁面中。首先是編寫支持正則表達式的代碼:
<%
Dim re, strHTML
Set re = new RegExp ' 創建正則表達式對象
re.IgnoreCase = true
re.Global = false ' 第一次匹配之後結束查找
%>
下面考慮一下我們要提取的區域:在這裡,我們要提取的是整個<table>結構,包括結束標記和新聞標題的文本。因此查找的起始字符應該是<table>開始標記: re.Pattern = "<table.*(?=Headline)"。這個正則表達式匹配表格的開始標記,能夠返回開始標記直至“Headline”之間的所有內容(換行除外)。下面是返回已匹配HTML代碼的方法:
' 把所有匹配的HTML代碼放入Matches集合
Set Matches = re.Execute(strHTML)
' 顯示所有匹配的HTML代碼
For Each Item in Matches
Response.Write Item.Value
Next
' 顯示其中一項
Response.write Matches.Item(0).Value
運行這段代碼處理前面顯示的HTML片斷,正則表達式返回一次匹配的內容如下: <table border="0" width="11%" class="。正則表達式中的“(?=Headline)”沒有獲取字符,所以不能看到表格class屬性的值。要獲取表格剩余部分的代碼也相當簡單: re.Pattern = "<table.*(?=Headline)(.|n)*?</table>"。其中:“(.|n)”後面的“*”匹配0個到多個任意字符;而“?”使得“*”匹配范圍最小化,即在找到表達式的下一部分之前匹配盡可能少的字符。</table>是表格的結束標記。
“?”限制符非常重要,它防止了表達式返回其他表格的代碼。例如對於前面給出的HTML代碼片斷,如果刪除這個“?”則返回內容將是:
<table border="0" width="11%" class="Headline">
<tr>
<td width="100%">
<p align="center">伊拉克戰爭!</td>
</tr>
</table>
<table border="0" width="11%" class="Someotherstory">
<tr>
<td width="100%">
<p align="center">其他內容...</td>
</tr>
</table>
返回的內容不僅包含了Headline表的<