#content-region{background-image:url(http://p.blog.csdn.net/images/p_blog_csdn_net/rcom10002/EntryImages/20081027/watermark.gif);}#content-regionh3{border:1pxdotted#333333;background-color:#f9f9f9;padding:10px;font-size:24p" />

欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

簡單入門正則表達式 - 第十章 正則表達式綜合應

系統 1693 0
<style> #content-region { background-image: url(http://p.blog.csdn.net/images/p_blog_csdn_net/rcom10002/EntryImages/20081027/watermark.gif); } #content-region h3 { border: 1px dotted #333333; background-color: #f9f9f9; padding: 10px; font-size: 24px; } #content-region p { font-family: "宋體", "仿宋"; font-size: 16px; line-height: 28px; text-decoration: none; text-indent: 32px; } #content-region .regex-pattern { font-style: oblique; font-family: "Courier New", Courier, monospace; background-color: #FFCCCC; border-top-style: solid; border-right-style: none; border-bottom-style: solid; border-left-style: none; border-top-color: #FF0000; border-bottom-color: #FF0000; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-right-color: #FF0000; border-left-color: #FF0000; padding: 0px 5px 0px 5px; } #content-region .regex-result { font-family: "Courier New", Courier, monospace; background-color: #A4FFE1; border-top-style: solid; border-right-style: none; border-bottom-style: solid; border-left-style: none; border-top-color: #339966; border-bottom-color: #339966; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-right-color: #339966; border-left-color: #339966; padding: 0px 5px 0px 5px; } #content-region blockquote { padding: 10px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dotted; border-right-style: dotted; border-bottom-style: dotted; border-left-style: dotted; width: auto; } #content-region img { border: 1px dotted #000000; padding: 16px; background-color: #f9f9f9; margin-top: 16px; margin-right: 16px; margin-bottom: 16px; margin-left: 64px; } #content-region code { white-space: pre; } </style>
<!-- InstanceBeginEditable name="contentRegion" -->

當我們在瀏覽網頁的時候,常常會在瀏覽器中鍵入網址,如 www.cctv.com,然后網址就會被轉換成相應的 IP 地址,其的結果可能會是“123.0.111.108”,每一個部分都是一個小于256的非負整數。嚴格地講,像007這樣的內容也是允許作為 IP 地址的一部分的,但在一般情況下,前面的“0”是不需要的。

在對 IP 地址格式的概念簡單了解之后,我們就來做一個驗證 IP 地址的實驗。首先構造一個能夠匹配三位數字的正則表達式 /d{1,3} ,它所匹配的結果就是 123 . 0 . 111 . 108 。注意,間隔的小數點并不作為匹配的結果。接下來,從結果的四組數字上可以看出,除了第一組數字之外,剩余的三組數字前面都有一個“小數點”,所以,我們可以構造一個新的表達式 /d{1,3}(/./d{1,3}){3} 來匹配整個字符串,第一個 /d{1,3} 匹配的是第一組數字,后面的內容匹配的是剩余的三組數字,并且每組數字前面必須要有一個“小數點”,因為“小數點”在正則表達式中可以代表任意字符,所以在使用時需要進行轉義。

在第一章概述的內容中我們就了解到,正則表達式主要用于字符串匹配,而對于邏輯校驗它就不太擅長了,不過為了更好地掌握正則表達式應用技巧,在這里我們仍用它做一次邏輯上的校驗,之后,我們再看一個更為合理并且簡單的校驗方法。之前我們已經構造了一個能夠簡單驗證 IP 地址的正則表達式了,下面要做的就是邏輯校驗,更確切地說,就是保證每組數字處于 0 至 255 之間即可。從范圍上看,每組數字最大位數也就是三位,最大值為 255。因此,我們需要先構造一個 200 至 255 的三位數樣式 2([0-4]/d|5[0-5]) ,然后構造出一個匹配大于等于 0 小于 200 的樣式 [0-1]?/d{1,2} 。現在把兩部分樣式合并起來 2([0-4]/d|5[0-5])|[0-1]?/d{1,2} ,這樣就可以滿足每組的數字驗證,最后統一整理就是 (2([0-4]/d|5[0-5])|[0-1]?/d{1,2})(/.(2([0-4]/d|5[0-5])|[0-1]?/d{1,2})){3} 。這個樣式與之前構造的 /d{1,3}(/./d{1,3}){3} 類似,只是將不含有數字范圍的 /d 替換成含有數字范圍驗證的 2([0-4]/d|5[0-5])|[0-1]?/d{1,2}

現在,我們再嘗試一種較為合理而且簡單的編程實現方法,首先用正則表達式 /. 分割成四組數字,用程序驗證每組數字的范圍,判斷它們是否存在于 0 至 255 之間,以下是 VB.Net 所實現的代碼:

  1. Imports System . Text . RegularExpressions
  2. Module ModuleForTest
  3. Sub Main ()
  4. Try
  5. Console . WriteLine ( "請輸入要驗證的IP地址:" )
  6. Dim userInput As String = System . Console . ReadLine ()
  7. If Regex . IsMatch ( userInput , "^[0-9]{1,3}(/.[0-9]{1,3}){3}$" ) Then
  8. Dim ipSections As String () = Regex . Split ( userInput , "/." )
  9. For Each ipNumber As String In ipSections
  10. Dim tempNumber As Integer = Convert . ToInt32 ( ipNumber )
  11. If tempNumber < 0 OrElse tempNumber > 256 Then
  12. Console . WriteLine ( "非法IP地址!" )
  13. Exit Sub
  14. End If
  15. Next
  16. Console . WriteLine ( "合法IP地址!" )
  17. Else
  18. Console . WriteLine ( "非法IP地址!" )
  19. End If
  20. Catch ex As Exception
  21. Console . WriteLine ( ex . Message )
  22. Finally
  23. Console . ReadLine ()
  24. End Try
  25. End Sub
  26. End Module

接下來我們再來看一個關于文件打印的頁碼設置的校驗例子。從下圖可以看出,打印范圍可以用以逗號分隔的多個具體的頁碼值來表現,也可以用以逗號分隔的多個頁碼范圍來表現,或者是將頁碼值與頁面范圍進行的組合來表現;而對于頁碼的內容的設置,則可以通過頁碼和頁碼加小節組成。在這里我們先從簡單的頁碼設置入手,然后再處理比較復雜的設置。

對于具體的單一頁碼來說,直接利用數字表達式 /d+ 來表示就可以了,但頁碼不可能從零開始,所以首位應該用 1 至 9 表示,而后續的數字則不受零的限制,可以采用 /d 來表示,所以修改后的非零自然數樣式應該為 [1-9]/d* ;而對于頁碼范圍來說,應該由一對具體的頁碼來表現,再在中間放一個標示范圍的標識符“-”,最終構造出來的樣式就應該為 [1-9]/d*-[1-9]/d* 。現在,我們把這兩個樣式結合起來,組合出我們想要的具體頁碼與頁碼范圍的混合樣式 ([1-9]/d*|[1-9]/d*-[1-9]/d*)(,([1-9]/d*|[1-9]/d*-[1-9]/d*))* 。先來分析下逗號之前的樣式 ([1-9]/d*|[1-9]/d*-[1-9]/d*) ,它所匹配的內容就是一個單一的具體的頁碼或是一個頁碼范圍,而在后面的重復樣式中,除了逗號之外,其余的樣式前面的完全一致,這是便于后續添加多個這樣的單一的具體頁碼或頁碼范圍。現在構造出來的樣式就可以完全滿足數字表現形式的頁碼或頁碼范圍組合了。

接下來我們繼續構造頁碼加小節的組合樣式。從圖中我們可以看出,單一的頁碼或單一的小節,都是用字母加數字組合,如第一頁為 p1,第二頁為 p2,依此類推,小節的表述形式與頁碼類似,只是字母為 s,第一節為 s1,第二節為 s2……這樣一來,頁碼加小節的組合就是 p[1-9]/d*s[1-9]/d* ,同數字頁碼表現形式的規則一樣,我們重復利用這個表達式,構造一個完整的樣式就應該是 (p[1-9]/d*s[1-9]/d*|p[1-9]/d*s[1-9]/d*-p[1-9]/d*s[1-9]/d*)(,(p[1-9]/d*s[1-9]/d*|p[1-9]/d*s[1-9]/d*-p[1-9]/d*s[1-9]/d*))* ,逗號之前是匹配單一的頁碼與小節,或是頁碼與小節的范圍,逗號以及逗號之后部分利用“*”使這種規則延續下去。

通過第一章的內容我們可以知道,正則表達式并不擅長邏輯處理,所以我們構造出的頁碼表達式也僅僅是對形式的一種約束,其中并不含有任何邏輯,如果想加入邏輯功能,在必要的情況下就得配合一段程序代碼了。在這里,我們暫時不考慮頁碼之間空白字符問題并且假定頁碼出現的順序必須從小到大,然后用下面這段 Javascript 程序,配合第一種樣式來驗證這個規則。

  1. < script language = "javascript" type = "text/javascript" >
  2. function isValidPageRangeForPrint {
  3. var pageRangeText = document . getElementById ( "page_range" ). value ;
  4. // 是否錄入頁碼范圍
  5. if (! pageRangeText ) {
  6. return false ;
  7. }
  8. // 是否滿足頁碼范圍的格式
  9. if (!/ ^ ([ 1 - 9 ] /d *|[ 1 - 9 ] /d *-[ 1 - 9 ] /d *)(,([ 1 - 9 ] /d *|[ 1 - 9 ] /d *-[ 1 - 9 ] /d *))* $ /. test ( pageRangeText )) {
  10. return false ;
  11. }
  12. // 是否滿足頁碼從小到大的邏輯規則
  13. var regexForSinglePage = /[ 1 - 9 ] /d*/ ;
  14. var matchResult = pageRangeText . match (/[ 1 - 9 ] /d *|[ 1 - 9 ] /d *-[ 1 - 9 ] /d*/ );
  15. var pageEnumCount = 0 ;
  16. var pageContainer = new Object ();
  17. // 將所有出現的頁碼按照出現的順序保存到pageContainer中
  18. for ( var i = 0 ; i < matchResult . length ; i ++) {
  19. if ( regexForSinglePage . test ( matchResult [ i ])) {
  20. // 保存單一頁碼
  21. pageContainer [ "" + pageEnumCount ++] = matchResult [ i ];
  22. } else {
  23. // 保存起始頁碼與結束頁碼
  24. var pagesForRange = matchResult [ i ]. split (/-/);
  25. pageContainer [ "" + pageEnumCount ++] = pagesForRange [ 0 ];
  26. pageContainer [ "" + pageEnumCount ++] = pagesForRange [ 1 ];
  27. }
  28. }
  29. // 對pageContainer中的頁碼進行驗證,后續的頁碼必須大于前方的頁碼
  30. while ( pageEnumCount -- > 0 ) {
  31. if ( pageContainer [ pageEnumCount ] < pageContainer [ pageEnumCount - 1 ]) {
  32. // 后續頁碼小于前方頁碼時
  33. return false ;
  34. }
  35. }
  36. return true ;
  37. }
  38. </ script >
<!-- InstanceEndEditable -->

簡單入門正則表達式 - 第十章 正則表達式綜合應用舉例


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产浮力第一页 | 亚洲欧美日韩激情在线观看 | 日本精品一区二区三区四区 | 国产在线精品一区二区三区 | 高清国产一区二区三区四区五区 | 精品亚洲欧美高清不卡高清 | 欧美成人一级视频 | 色狠狠xx| 中国女警察一级毛片视频 | 欧美日韩国产在线播放 | 激情丁香六月 | 一区二区三区四区电影 | 成人一区专区在线观看 | 九九色影院 | 国产91亚洲精品 | 成人免费毛片aaaaaa片 | 国产一区二区三区免费观看 | 激情av在线 | 亚洲第一区第二区 | 国产亚洲成在线播放va | 亚洲福利视频一区二区 | 性色成人网 | 欧洲成人午夜免费大片 | 日本黄大片影院一区二区 | 国产尤物在线观看一区二区 | 午夜九九九 | 欧美日韩午夜 | 99午夜高清在线视频在观看 | 欧美午夜艳片欧美精品 | 亚洲精品日本高清中文字幕 | 国产农村妇女毛片精品久久麻豆 | 毛片免费观看 | av av片在线看 | 日日摸夜夜添免费毛片小说 | 久久午夜精品 | 亚洲欧洲在线视频 | 欧美ab在线 | 欧美精品一区二区三区在线 | 人人爱免费在线观看 | 日韩视频中文字幕 | 尤物网站永久在线观看 |