Regex簡介(微軟)--14.後向引用

來源:互聯網
上載者:User
微軟|正則 後向引用

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

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

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

Is is the cost of of gasoline going up up?

根據所寫內容,上面的句子明顯存在單詞多次重複的問題。如果能有一種方法無需尋找每個單詞的重複現象就能修改該句子就好了。下面的 Visual Basic Scripting Edition Regex使用一個子運算式就可以實現這一功能。

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

等價的 VBScript 運算式為:

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

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

在 Visual Basic Scripting Edition 運算式中,Regex後面的全域標誌 ('g') 表示該運算式將用來在輸入字串中尋找儘可能多的匹配。大小寫敏感性由運算式結束處的大小寫敏感性標記 ('i') 指定。多行標記指定可能出現在分行符號的兩端的潛在匹配。對 VBScript 而言,在運算式中不能設定各種標記,但必須使用 RegExp 對象的屬性來顯式設定。

使用上面所示的Regex,下面的 Visual Basic Scripting Edition 代碼可以使用子匹配資訊,在一個文字字串中將連續出現兩次的相同單詞替換為一個相同的單詞:

var ss = "Is is the cost of of gasoline going up up?.\n";
var re = /\b([a-z]+) \1\b/gim; //建立Regex樣式.
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

下面的Regex可以提供這個功能。對 Visual Basic Scripting Edition,為:

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

對 VBScript 為:

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

第一個附加子運算式是用來捕獲該 網址的協議部分。該子運算式匹配位於一個冒號和兩個正斜杠之前的任何單詞。第二個附加子運算式捕獲該地址的網域名稱地址。該子運算式匹配不包括 '^'、 '/' 或 ':' 字元的任何字元序列。第三個附加子運算式捕獲網站連接埠號碼碼,如果指定了該連接埠號碼。該子運算式匹配後跟一個冒號的零或多個數字。最後,第四個附加子運算式捕獲由該 網址指定的路徑以及\或者頁面資訊。該子運算式匹配一個和多個除'#' 或空格之外的字元。

將該Regex應用於上面所示的 URI 後,子匹配包含下述內容:

RegExp.$1 包含 "http"

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

RegExp.$3 包含 ":80"

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



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。