更新:2007 年 11 月
規則運算式最重要的功能之一,是能夠儲存已比對模式的一部分以供日後重複使用。由於您可能重新叫用,所以可在規則運算式模式或模式的一部分前後置入括弧,將運算式的該部分儲存至暫存緩衝區中。您可藉由使用非擷取型中繼字元 ?:、?= 或 ?! 來覆寫擷取。
使用反向參考
每個擷取的子比對會按照在規則運算式模式中從左至右的出現順序加以儲存。緩衝區號碼從一開始,最多可有 99 個擷取型子運算式。每個緩衝區都可使用 \n 來存取,其中 n 是一位或兩位十進位數字,用以識別特定緩衝區。
最簡單、最實用的反向參考應用之一,是能夠找出文字中兩個完全一樣且相鄰的單字。以下面的句型為例:
Is is the cost of of gasoline going up up?
上面的句型明確具有數個完全一樣的單字。設計一種校準句型而不用尋找重複的所有單一單字是不錯的主意。下列規則運算式使用單一子運算式來達成這個目的:
/\b([a-z]+) \1\b/gi
擷取的運算式 (如 [a-z]+ 所指定) 包括一個或多個字母字元。規則運算式的第二部分是前一擷取的子比對的參考,即放在括號內的運算式只比對第二次出現的單字。\1 指定第一個子比對。字緣中繼字元會確保只偵測整個單字。否則,這個運算式會錯誤識別如 "is issued" 或 "this is" 之類的字詞。
接在規則運算式之後的全域旗標 (g),表示會套用運算式至輸入字串中可找到的任何對象。運算式尾端的不區分大小寫 (i) 旗標,表示不區分大小寫。多行旗標指定在新行字元的任一邊都可能發生的比對。
使用上面的規則運算式,下列程式碼可使用子比對資訊,以文字字串中第一次出現的同一單字來取代兩個連續且完全一樣的單字項目:
var ss = "Is is the cost of of gasoline going up up?.\n";
var re = /\b([a-z]+) \1\b/gim; //Create regular expression pattern.
var rv = ss.replace(re,"$1"); //Replace two occurrences with one.
在 replace 方法內使用 $1 表示第一項儲存的子比對。如果具有一個以上的子比對,請使用 $2、$3 等,依序表示這些子比對。
反向參考也可以將 Universal Resource Indicator (URI) 細分成元件部分。假設您要將下列 URI 細分成通訊協定 (ftp、http 等等)、網域位址及網頁/路徑:
https://www.microsoft.com/taiwan/products/develop/scripting/default.asp
下列規則運算式提供該功能:
/(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/
第一個放在括號內的子運算式會擷取網站位址的通訊協定部分。該子運算式比對放在冒號及兩個正斜線之前的任何單字。第二個放在括號內的子運算式會擷取網址的網域位址部分。該子運算式比對 / 或 : 以外的一或多個字元。如果有指定一個通訊埠編號,第三個放在括號內的子運算式就會進行擷取。該子運算式會比對接在冒號後的零位或多位數字,但您最多只能重複這個子運算式一次。最後,第四個放在括號內的子運算式會擷取網站位址指定的路徑和 (或) 網頁資訊。該子運算式會比對不包含 # 或空格字元的任何字元序列。
將規則運算式套用至前面的 URI,子比對包含下列項目:
RegExp.$1 包含 "http"
RegExp.$2 包含 "msdn.microsoft.com"
RegExp.$3 包含 ":80"
RegExp.$4 包含 "/scripting/default.htm"