<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    JAVA & XML & JAVASCRIPT & AJAX & CSS

    Web 2.0 技術儲備............

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      77 隨筆 :: 17 文章 :: 116 評論 :: 0 Trackbacks

    選擇允許使用 '|' 字符來在兩個或多個候選項中進行選擇。通過擴展章節標題的正則表達式,可以將其擴充為不僅僅適用于章節標題的表達式。不過,這可沒有想象的那么直接。在使用選擇時,將匹配'|' 字符每邊最可能的表達式。你可能認為下面的 JScript 和 VBScript 表達式將匹配位于一行的開始和結束位置且后跟一個或兩個數字的 'Chapter' 或 'Section':

    				
    						/^Chapter|Section [1-9][0-9]{0,1}$/ "^Chapter|Section [1-9][0-9]{0,1}$"
    				
    		

    不幸的是,真正的情況是上面所示的正則表達式要么匹配位于一行開始處的單詞 'Chapter',要么匹配一行結束處的后跟任何數字的 'Section'。如果輸入字符串為 'Chapter 22',上面的表達式將只匹配單詞 'Chapter'。如果輸入字符串為 'Section 22',則該表達式將匹配 'Section 22'。但這種結果不是我們此處的目的,因此必須有一種辦法來使正則表達式對于所要做的更易于響應,而且確實也有這種方法。

    可以使用圓括號來限制選擇的范圍,也就是說明確該選擇只適用于這兩個單詞 'Chapter' 和 'Section'。不過,圓括號同樣也是難處理的,因為它們也用來創建子表達式,有些內容將在后面關于子表達式的部分介紹。通過采用上面所示的正則表達式并在適當位置添加圓括號,就可以使該正則表達式既可以匹配 'Chapter 1',也可以匹配 'Section 3'。

    下面的正則表達式使用圓括號將 'Chapter' 和 'Section' 組成一組,所以該表達式才能正確工作。對 JScript 為:

    				
    						/^(Chapter|Section) [1-9][0-9]{0,1}$/
    				
    		

    對 VBScript 為:

    				
    						"^(Chapter|Section) [1-9][0-9]{0,1}$"
    				
    		

    這些表達式工作正確,只是產生了一個有趣的副產品。在 'Chapter|Section' 兩邊放置圓括號建立了適當的編組,但也導致兩個待匹配單詞之一都被捕獲供今后使用。由于在上面所示的表達式中只有一組圓括號,因此只能有一個捕獲的 submatch。可以使用 VBScript 的Submatches 集合或者JScript 中RegExp 對象的 $1-$9 屬性來引用這個子匹配。

    有時捕獲一個子匹配是所希望的,有時則是不希望的。在說明所示的示例中,真正想做的就是使用圓括號對單詞 'Chapter' 或 'Section' 之間的選擇編組。并不希望在后面再引用該匹配。實際上,除非真的是需要捕獲子匹配,否則請不要使用。由于不需要花時間和內存來存儲那些子匹配,這種正則表達式的效率將更高。

    可以在正則表達式模式圓括號內部的前面使用 '?:'來防止存儲該匹配供今后使用。對上面所示正則表達式的下述修改提供了免除子匹配存儲的相同功能。對 JScript:

    				
    						/^(?:Chapter|Section) [1-9][0-9]{0,1}$/
    				
    		

    對 VBScript:

    				
    						"^(?:Chapter|Section) [1-9][0-9]{0,1}$"
    				
    		

    除了 '?:' 元字符,還有兩個非捕獲元字符用于稱之為預查的匹配。一個為正向預查,用 ?= 表示, 在任何開始匹配圓括號內的正則表達式模式的位置來匹配搜索字符串。一個為負向預查,用 '?!' 表示,在任何開始不匹配該正則表達式模式的位置來匹配搜索字符串。

    例如,假定有一個包含引用有 Windows 3.1、Windows 95、Windows 98 以及 Windows NT 的文檔。進一步假設需要更新該文檔,方法是查找所有對 Windows 95、Windows 98 以及 Windows NT 的引用,并將這些引用更改為 Windows 2000。可以使用下面的 JScript 正則表達式,這是一個正向預查,來匹配 Windows 95、Windows 98 以及 Windows NT:

    				
    						/Windows(?=95 |98 |NT )/
    				
    		

    在 VBScript 要進行同樣的匹配可以使用下述表達式:

    				
    						"Windows(?=95 |98 |NT )"
    				
    		

    找到一個匹配后,緊接匹配到的文字(而不包括預查中使用的字符)就開始對下一次匹配的搜索。例如,如果上面所示的表達式匹配到 'Windows 98',則將從 'Windows' 而不是 '98' 之后繼續查找。

    后向引用

    正則表達式一個最重要的特性就是將匹配成功的模式的某部分進行存儲供以后使用這一能力。請回想一下,對一個正則表達式模式或部分模式兩邊添加圓括號將導致這部分表達式存儲到一個臨時緩沖區中。可以使用非捕獲元字符 '?:', '?=', or '?!' 來忽略對這部分正則表達式的保存。

    所捕獲的每個子匹配都按照在正則表達式模式中從左至右所遇到的內容存儲。存儲子匹配的緩沖區編號從 1 開始,連續編號直至最大 99 個子表達式。每個緩沖區都可以使用 '\n' 訪問,其中 n 為一個標識特定緩沖區的一位或兩位十進制數。

    后向引用一個最簡單,最有用的應用是提供了確定文字中連續出現兩個相同單詞的位置的能力。請看下面的句子:

    				
    						Is is the cost of of gasoline going up up?
    				
    		

    根據所寫內容,上面的句子明顯存在單詞多次重復的問題。如果能有一種方法無需查找每個單詞的重復現象就能修改該句子就好了。下面的 JScript 正則表達式使用一個子表達式就可以實現這一功能。

    				
    						/\b([a-z]+) \1\b/gi
    				
    		

    等價的 VBScript 表達式為:

    				
    						"\b([a-z]+) \1\b"
    				
    		

    在這個示例中,子表達式就是圓括號之間的每一項。所捕獲的表達式包括一個或多個字母字符,即由'[a-z]+' 所指定的。該正則表達式的第二部分是對前面所捕獲的子匹配的引用,也就是由附加表達式所匹配的第二次出現的單詞。'\1'用來指定第一個子匹配。單詞邊界元字符確保只檢測單獨的單詞。如果不這樣,則諸如 "is issued" 或 "this is" 這樣的短語都會被該表達式不正確地識別。

    在 JScript 表達式中,正則表達式后面的全局標志 ('g') 表示該表達式將用來在輸入字符串中查找盡可能多的匹配。大小寫敏感性由表達式結束處的大小寫敏感性標記 ('i') 指定。多行標記指定可能出現在換行符的兩端的潛在匹配。對 VBScript 而言,在表達式中不能設置各種標記,但必須使用 RegExp 對象的屬性來顯式設置。

    使用上面所示的正則表達式,下面的 JScript 代碼可以使用子匹配信息,在一個文字字符串中將連續出現兩次的相同單詞替換為一個相同的單詞:

    				
    						var ss = "Is is the cost of of gasoline going up up?.\n"; var re = /\b([a-z]+) \1\b/gim; //
    				創建正則表達式樣式. var rv = ss.replace(re,"$1"); //用一個單詞替代兩個單詞.

    最接近的等價? VBScript 代碼如下:

    				
    						Dim ss, re, rv ss = "Is is the cost of of gasoline going up up?." & vbNewLine Set re = New RegExp re.Pattern = "\b([a-z]+) \1\b" re.Global = True re.IgnoreCase = True re.MultiLine = True rv = re.Replace(ss,"$1")
    				
    		

    請注意在 VBScript 代碼中,全局、大小寫敏感性以及多行標記都是使用 RegExp 對象的適當屬性來設置的。

    replace 方法中使用 $1 來引用所保存的第一個子匹配。如果有多個子匹配,則可以用 $2, $3 等繼續引用。

    后向引用的另一個用途是將一個通用資源指示符 (URI) 分解為組件部分。假定希望將下述的URI 分解為協議 (ftp, http, etc),域名地址以及頁面/路徑:

    				
    						
    								http://msdn.microsoft.com:80/scripting/default.htm
    						
    				
    		

    下面的正則表達式可以提供這個功能。對 JScript,為:

    				
    						/(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/
    				
    		

    對 VBScript 為:

    				
    						"(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)"
    				
    		

    第一個附加子表達式是用來捕獲該 web 地址的協議部分。該子表達式匹配位于一個冒號和兩個正斜杠之前的任何單詞。第二個附加子表達式捕獲該地址的域名地址。該子表達式匹配不包括 '^'、 '/' 或 ':' 字符的任何字符序列。第三個附加子表達式捕獲網站端口號碼,如果指定了該端口號。該子表達式匹配后跟一個冒號的零或多個數字。最后,第四個附加子表達式捕獲由該 web 地址指定的路徑以及\或者頁面信息。該子表達式匹配一個和多個除'#' 或空格之外的字符。

    將該正則表達式應用于上面所示的 URI 后,子匹配包含下述內容:

    RegExp.$1 包含 "http"

    RegExp.$2 包含 "msdn.microsoft.com"

    RegExp.$3 包含 ":80"

    RegExp.$4 包含 "/scripting/default.htm"

    posted on 2006-03-20 09:44 Web 2.0 技術資源 閱讀(2229) 評論(0)  編輯  收藏 所屬分類: Javascript
    主站蜘蛛池模板: 亚洲欧美日韩综合久久久久| 亚洲人成电影福利在线播放| 亚洲一区二区三区久久| 中文字幕视频免费| 亚洲欧洲自拍拍偷综合| 57PAO成人国产永久免费视频| 亚洲精品在线视频观看| 无码国产精品一区二区免费虚拟VR| 最近免费中文字幕大全免费版视频 | 国产91色综合久久免费| 亚洲另类小说图片| 免费一本色道久久一区| 亚洲精品国产精品| 亚洲精品第一国产综合精品99| 中文日本免费高清| 亚洲成a人片在线观看中文动漫 | 亚洲中文字幕无码久久| 免费激情视频网站| 一级做α爱过程免费视频| 久热综合在线亚洲精品| 和日本免费不卡在线v| 亚洲AV香蕉一区区二区三区| 亚洲国产精品综合久久一线| 成年女人A毛片免费视频| 亚洲天堂视频在线观看| 好爽又高潮了毛片免费下载| 七次郎成人免费线路视频| 亚洲国产成人高清在线观看 | 美女被爆羞羞网站在免费观看| 久久精品国产精品亚洲人人| 在免费jizzjizz在线播| 亚洲精品无码专区在线播放| 亚洲色大成网站www永久一区| 最近2019免费中文字幕视频三| 亚洲人成色在线观看| 亚洲综合精品香蕉久久网| 久久WWW免费人成一看片| 男男黄GAY片免费网站WWW| 亚洲av无码乱码国产精品fc2| 中文字幕无码视频手机免费看| 四虎影视永久在线精品免费|