程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> ASP編程 >> ASP入門教程 >> 正則表達式簡介(13)

正則表達式簡介(13)

編輯:ASP入門教程
13.選擇與編組

選擇允許使用 '|' 字符來在兩個或多個候選項中進行選擇。通過擴展章節標題的正則表達式,可以將其擴充為不僅僅適用
於章節標題的表達式。不過,這可沒有想象的那麼直接。在使用選擇時,將匹配'|' 字符每邊最可能的表達式。你可能認
為下面的 Visual Basic Scripting Edition 和 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' 組成一組,所以該表達式才能正確工作。對 Visual Basic 
Scripting Edition 為:

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

對 VBScript 為:

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

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

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

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

/^(?: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。可以
使用下面的 Visual Basic Scripting Edition 正則表達式,這是一個正向預查,來匹配 Windows 95、Windows 98 以及 
Windows NT:

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

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

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

找到一個匹配後,緊接匹配到的文字(而不包括預查中使用的字符)就開始對下一次匹配的搜索。例如,如果上面所示的
表達式匹配到 'Windows 98',則將從 'Windows' 而不是 '98' 之後繼續查找。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved