簡介
正則表達式的最重要功能之一是存儲匹配的模式的一部分以供以後重新使用的能力。您可能想起,若在正則表達式模式或模式的一部分兩側加上括弧,就會導致表達式的一部分被存儲到臨時緩衝區中。可以通過使用非捕獲元字元 ?:、?= 或 ?! 來重寫捕獲。
使用反向引用
每個捕獲的子匹配項按照它們在正則表達式模式中從左到右出現的順序存儲。緩衝區編號從 1 開始,最多可存儲 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等依次引用它們。
反向引用還可以將通用資源指示符 (URI) 分解為其組件。假定您想將下面的 URI 分解為協定(ftp、http 等等)、域地址和頁/路徑: