亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Regex > 正文

正則表達式的應用技巧

2024-09-07 17:40:03
字體:
來源:轉載
供稿:網友

??  正則表達式為字符串模式匹配提供了高效方便的方法,那么你知道怎么應用正則表達式的嗎?正好這段時間整理出了正則表達式的四則技巧內容,現在我們去看看吧。
??  一、檢驗密碼和郵件地址的格式?

??  我們的第一個實例示范正則表達式的一項基本功能:抽象地描述任意復雜的字符串。它的意思就是,正則表達式給予程序員一種形式化的字符串描述方法,只需很少的代碼即可描述出應用遇到的任意字符串模式。例如,對于不從事技術工作的人來說,密碼格式的要求可以描述如下:密碼的第一個字符必須是字母,密碼最少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("aabb@yahoo.com")?
??%>?
------------------------------------------------------
二、提取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的表格?,F在我們要創建正則表達式,通過正則表達式找到這個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表的<table>標記,而且還包含了Someotherstory表格,由此可以看出,這里的“?”是必不可少的。?
??  本例假設了一些相當理想化的前提。實際應用中情況往往要復雜得多,特別是你對正在使用的源HTML代碼的編寫沒有任何影響力時,編寫ASP代碼尤為困難。最有效的方法是,多花些時間分析待提取內容附近的HTML,經常地測試,確保提取出來的內容正是自己所需要的。另外,應當重視并處理正則表達式不能匹配源HTML頁面任何內容的情形。內容的更新可能非??焖?,不要只因為別人改變了內容的格式而讓自己的頁面出現低級可笑的錯誤。
----------------------------------------------------
三、解析文本數據文件?

??  數據文件的格式和種類很多,XML文檔、結構化文本甚至非結構化文本都經常成為ASP應用的數據源。下面我們要看的一個例子是使用限定符的結構化文本文件。限定符(比如引號)表示字符串各個部分不可分割,即使字符串內部包含把記錄分隔成字段的分隔符也一樣。?
??  下面是一個簡單的結構化文本文件:?

??姓,名,?電話,?說明?
??孫,悟空,?312?555?5656,?ASP很好?
??豬,八戒,?847?555?5656,?我是電影制片人?


??  這個文件非常簡單,它的第一行是標題,下面兩行是用逗號作為分隔符的記錄。要解析這個文件也很簡單,只需先把文件分割成行(根據換行符號),然后把各個記錄按照字段分割。但是,如果我們在某個字段內容中加入了逗號:?


??姓,名,?電話,?說明?
??孫,悟空,?312?555?5656,?我喜歡ASP,還有VB和SQL?
??豬,八戒,?847?555?5656,?我是電影制片人?
??  解析第一個記錄時就會出現問題,因為在只認可逗號分隔符的解析器看來它的最后一個字段包含了兩個字段的內容。為了避免出現這類問題,包含分隔符的字段必須用限定符包圍。單引號就是一種常用的限定符。把上面的文本文件加上單引號限定符之后,它的內容如下所示:?


??姓,名,?電話,?說明?
??孫,悟空,?312?555?5656,?'我喜歡ASP,還有VB和SQL'?
??豬,八戒,?847?555?5656,?'我是電影制片人'?


??  現在我們能夠肯定哪一個逗號是分隔符、哪一個逗號是字段內容了,即只需把引號內部出現的逗號視為字段的內容。接下來我們要做的就是實現一個正則表達式解析器,由這個解析器確定何時根據逗號分割字段、何時把逗號視為字段內容。?
??  這里的問題與大多數正則表達式所面臨的略有不同。通常我們查看的是文本的一小部分,看看它是否能夠和正則表達式匹配。但在這里,只有考慮了整行文本之后我們才能可靠地判斷出哪些內容位于引號之內。?
??  下面是一個說明該問題的例子。從某個文本文件隨意抽取半行內容,得到:1,?沙灘,?黑色,?21,?',?狗,?貓,?鴨子,?',?。在這個例子中,因為“1”的左邊還有其他數據,要解析清楚它的內容是極其困難的。我們不知道這個數據片斷的前面有多少單引號,從而也就無法判斷哪些字符位于引號之內(在引號之內的文本解析時不能分割)。如果這個數據片斷之前有偶數個(或者沒有)單引號,那么“',?狗,?貓,?鴨子,?'”是用引號界定的字符串且不可分割。如果前面的引號數量是奇數,那么“1,?沙灘,?黑色,?21,?'”是某個字符串的結束部分且不可分割。?
??  因此,正則表達式必須分析整行文本,全面考慮出現了多少引號才能確定字符是處在引號對的內部還是外部,即:,(?=([^']*'[^']*')*(?![^']*'))。這個正則表達式首先找到一個引號,然后繼續查找并保證逗號后面的單引號數量或者是偶數、或者是0。該正則表達式以下面這個判斷為基礎:如果逗號后面的單引號數量是偶數,那么這個逗號位于字符串之外。下表給出了更詳細的說明:?
??,?尋找一個逗號?
??(?=?繼續向前查找以匹配下面這個模式:?
??(?開始一個新的模式?
??[^']*'?[非引號字符]0個或者多個,然后是一個引號?
??[^']*'[^']*)?[非引號字符]0個或者多個,然后是一個引號。結合前面的內容之后它匹配引號對?
??)*?結束模式并匹配整個模式(引號對)0次或者多次?
??(?!?向前查找,排除此模式?
??[^']*'?[非引號字符]0個或者多個,然后是一個引號?
??)?結束模式?
??  下面是一個VBScript函數,它接受一個字符串參數,根據字符串中的逗號分隔符、單引號限定符分割字符串,返回結果數組:?
??Function?SplitAdv(strInput)?
??Dim?objRE?
??Set?objRE?=?new?RegExp?

??'?設置RegExp對象?
??objRE.IgnoreCase?=?true?
??objRE.Global?=?true?
??objRE.Pattern?=?",(?=([^']*'[^']*')*(?![^']*'))"?

??'?Replace方法用chr(8)替換我們要用到的逗號,chr(8)即/b?
??'?字符,/b在字符串中出現的可能極為微小。?
??'?然后我們根據/b把字符串分割保存到數組?
??SplitAdv?=?Split(objRE.Replace(strInput,?"/b"),?"/b")?
??End?Function?
??  總而言之,用正則表達式解析文本數據文件具有高效、縮短開發時間的優點,能夠節省大量分析文件、根據復雜的條件提取有用數據的時間。在一個迅速發展的環境中仍會有許多傳統的數據可資利用,掌握如何構造高效的數據分析例程將是一種寶貴的技能。?
-------------------------------------------------------------------
四、字符串替換?
??  在最后一個例子中我們要看看VBScript正則表達式的替換功能。ASP經常用于動態地格式化從各種數據源獲得的文本。利用VBScript正則表達式的強大功能,ASP能夠動態地改變匹配的復雜文本。通過加入HTML標記突出顯示部分單詞就是一種常見的應用,比如突出顯示搜索結果中的搜索關鍵詞。?
??  為說明實現方法,下面我們來看一個突出顯示字符串中所有“.NET”的例子。這個字符串可以從任何地方獲得,比如數據庫或者其他Web網站。?
??<%?
??Set?regEx?=?New?RegExp?
??regEx.Global?=?true?
??regEx.IgnoreCase?=?True?

??'?正則表達式模式,?
??'?尋找任何結尾為“.NET”的單詞或者URL。?
??regEx.Pattern?=?"(/b[a-zA-Z/._]+?/.NET/b)"?

??'?用于測試替換功能的字符串?
??strText?=?"微軟建立了一個新網站www.ASP.NET。"?

??'?調用正則表達式的Replace方法?
??'?$1表示把匹配的文本插入當前位置?
??Response.Write?regEx.Replace(strText,?_?
??"<b?style='color:?#000099;?font-size:?18pt'>$1</b>")?
??%>?
?   這個例子中有幾個重要的地方必須注意。整個正則表達式被放入了一對圓括號中,它的作用是截取所有匹配的內容供以后使用,這些內容在替換文本中通過$1引用。類似的截取每次替換可以使用多達9個,分別通過$1到$9引用。正則表達式的Replace方法和VBScript本身的Replace函數不同,它只需要兩個參數:被搜索的文本,替換用的文本。?
??  在這個例子中,為了突出顯示搜索到的“.NET”字符串,我們用粗體標記以及其他樣式屬性來包圍這些字符串。使用這種搜索和替換技術,我們能夠方便地為網站搜索程序加上突出顯示搜索關鍵詞的功能,或者自動為頁面中出現的關鍵詞加上指向其他頁面的鏈接。?
??  希望本文介紹的正則表達式的應用技巧對你有所啟發。雖然本文的例子是用VBScript編寫的,但在ASP.NET中正則表達式同樣有大用處,它是服務器端控件表單檢驗的主要機制之一,而且通過System.Text.RegularExpressions命名空間導出到了整個.NET框架之中。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人国产精品免费视频| 久久婷婷国产麻豆91天堂| 亚洲精品在线视频| 中文字幕亚洲无线码a| 色婷婷亚洲mv天堂mv在影片| 免费av一区二区| 成人中文字幕+乱码+中文字幕| 精品视频—区二区三区免费| 91丨九色丨国产在线| 亚洲精品视频在线观看视频| 亚洲色图日韩av| 国产网站欧美日韩免费精品在线观看| 久久久免费精品视频| 国产欧美日韩高清| 色999日韩欧美国产| 久久99亚洲精品| 久久国产精彩视频| 成人h视频在线| 国产精品久久久久久久久久免费| 欧美午夜精品久久久久久久| 91九色蝌蚪国产| 精品久久香蕉国产线看观看亚洲| 久久国产天堂福利天堂| 久久久久久高潮国产精品视| 国产亚洲欧美视频| 欧美乱人伦中文字幕在线| 亚洲成人中文字幕| 成人免费网站在线观看| 国产精品久久久久久久久久三级| 国产精品视频精品| 国产精品美女久久久久久免费| 亚洲国产精品热久久| 91大神福利视频在线| 久久视频在线播放| 国产丝袜一区二区三区免费视频| 日韩免费中文字幕| 亚洲精品欧美一区二区三区| 久久精品人人爽| 91亚洲精品视频| 日韩亚洲欧美中文高清在线| 国模gogo一区二区大胆私拍| 欧美精品免费播放| 久久久免费高清电视剧观看| 成人淫片在线看| 久久精品国产电影| 国产精品激情av电影在线观看| 草民午夜欧美限制a级福利片| 亚洲变态欧美另类捆绑| 日韩av手机在线观看| 国产精品久久久久久久久久尿| 亚洲成人a级网| 中文字幕日韩免费视频| 国产精品美女主播在线观看纯欲| 精品性高朝久久久久久久| 国产主播欧美精品| 欧美高清自拍一区| 一区二区三区久久精品| 精品一区二区三区三区| 亚洲成人av在线播放| 在线看欧美日韩| 欧美日韩国产中字| 精品五月天久久| 91亚洲国产成人久久精品网站| 韩国三级电影久久久久久| 亚洲欧洲日产国产网站| 亚洲精品动漫久久久久| 成人中文字幕+乱码+中文字幕| 国产色婷婷国产综合在线理论片a| 国产精品日日摸夜夜添夜夜av| 日韩成人小视频| 亚洲xxxx做受欧美| 日本一欧美一欧美一亚洲视频| 亚洲人成网站999久久久综合| 欧美中文字幕第一页| 欧美精品久久久久久久久久| y97精品国产97久久久久久| 欧美日韩国产第一页| 色婷婷亚洲mv天堂mv在影片| 成人性教育视频在线观看| 精品偷拍各种wc美女嘘嘘| 久久亚洲综合国产精品99麻豆精品福利| 亚洲精品白浆高清久久久久久| 国产国语videosex另类| 4438全国成人免费| 国产脚交av在线一区二区| 久久久国产精品视频| 欧美激情2020午夜免费观看| 欧美成人精品一区二区| 91久久久久久久久久久| 国产婷婷成人久久av免费高清| 欧美日韩在线视频首页| 97热在线精品视频在线观看| 91久久精品视频| 色偷偷偷综合中文字幕;dd| 色偷偷噜噜噜亚洲男人的天堂| 亚洲无限乱码一二三四麻| 国产99久久精品一区二区| 成人午夜在线视频一区| 欧美性猛交xxxx免费看久久久| 91色琪琪电影亚洲精品久久| 欧美日本中文字幕| 国产男人精品视频| 成人黄色免费网站在线观看| 国产视频久久久久久久| 精品亚洲夜色av98在线观看| 久久免费少妇高潮久久精品99| 日韩电视剧免费观看网站| 久精品免费视频| 亚洲资源在线看| 欧美一区二区三区……| 91久热免费在线视频| 一区二区在线免费视频| 欧美成人黑人xx视频免费观看| 欧美一级免费视频| 国产精品亚洲精品| 深夜福利国产精品| 亚洲一区国产精品| 成人国内精品久久久久一区| 国内外成人免费激情在线视频| 91av网站在线播放| 国产性色av一区二区| 国产在线视频91| 亚洲欧美精品在线| 成人免费看黄网站| 亚洲视频axxx| 中文字幕精品影院| 日日骚久久av| 国产欧美日韩视频| 午夜精品一区二区三区在线播放| 日韩一级黄色av| 国产99久久精品一区二区 夜夜躁日日躁| 午夜精品视频在线| 久久影院中文字幕| 国产一区二区丝袜| 亚洲一区二区日本| 第一福利永久视频精品| 夜夜躁日日躁狠狠久久88av| 91精品久久久久久久久不口人| 欧美午夜性色大片在线观看| 成人h片在线播放免费网站| 中日韩午夜理伦电影免费| 性视频1819p久久| 91成人福利在线| 一区二区三区无码高清视频| 日韩精品中文字幕在线观看| 久久99久国产精品黄毛片入口| 国产欧美日韩91| 国产精品视频一区国模私拍| 国产一区香蕉久久| 91丝袜美腿美女视频网站| 欧美巨大黑人极品精男| 日本成熟性欧美| 亚洲午夜av久久乱码| 久久久久久久av| 91国语精品自产拍在线观看性色| 色噜噜亚洲精品中文字幕| 亚洲成人a级网| 81精品国产乱码久久久久久| 日韩欧美大尺度| 国产精品老牛影院在线观看| 亚洲欧洲黄色网| 日韩av中文字幕在线| 欧美激情第1页| 上原亚衣av一区二区三区|