反向參考

反向參考會識別在規則運算式 (Regular Expression) 內由相符群組所擷取的子字串。每個反向參考都由一個數字或名稱加以識別,並由 "\number" 或 "\k<name>" 標記法所參考。例如,如果輸入字串包含多次出現的任意子字串,您可以比對第一個出現的子字串與擷取的群組,接著使用反向參考來比對隨後出現的子字串。如需詳細資訊,請參閱反向參考建構群組建構

反向參考提供便利的方式,尋找字元的重複群組。可以將它們想像成要再次比對相同字串的簡略指令。例如,若要尋找重複的相鄰字元 (例如在 "tall" 這個字中的兩個 L),您可以使用規則運算式 (?<char>\w)\k<char>,它會使用中繼字元 \w 來尋找任何單字的字元。群組建構 (?<char> ) 內含中繼字元,強制規則運算式引擎記住子運算式比對 (在此情況中可能是任何單一字元),並以名稱 "char" 儲存。反向參考建構 \k<char> 會使引擎將先前儲存為 "char" 的符合字元與目前的字元相比較。整個規則運算式將成功地在凡是單一字元與前一字元相同的地方找到相符比對。

若要尋找重複的全字組,您可以修改群組子運算式來搜尋任何前面有空格的字元群組,而不是只搜尋任何單一字元。您可以用子運算式 \w+ (表示比對任何字元群組) 來代替中繼字元 \w,並使用中繼字元 \s 來比對字元群組前面的空格。此會產生規則運算式 (?<char>\s\w+)\k<char>,會尋找任何重複的全字,例如 " the the",但也會比對其他重複的指定字串,例如片語 "the theory"。

若要驗證第二個符合項目是否在字組界限 (Word Boundary) 上,請在重複的比對項目後面加上中繼字元 \b。產生的規則運算式 (?<char>\s\w+)\k<char>\b 只會尋找前面有空白區 (White Space) 的重複全字。

剖析反向參考

運算式 \1\9 永遠參考反向參考,而不是八進位程式碼。\11 和以上的多位數運算式被認為是反向參考,如果有反向參考對應那個數字的話,否則,會將它們解譯為八進位程式碼 (除非起始數字為 8 或 9,在這種情況下,會將它們視為常值 8 和 9)。如果規則運算式包含未定義的群組數字的反向參考,它被認為是剖析錯誤。如果有語意模糊的問題,您可以使用 \k<n> 標記法,這個標記法並不模稜兩可,且不會與八進位字元程式碼相混淆;同樣地,十六進位程式碼 (例如 \xdd) 也不模稜兩可,而且不會與反向參考相混淆。

啟用 ECMAScript 選項旗標時,反向參考行為略有不同。如需詳細資訊,請參閱 ECMAScript 與標準比對行為的比較

比對反向參考

反向參考會參照群組最近使用的定義 (由左至右比對時,最接近左邊的定義)。特別是,當群組進行多個擷取時,反向參考將參照最近發生的擷取。例如,(?<1>a)(?<1>\1b)* 會以擷取模式 (a)(ab)(abb) 來比對 aababb。迴圈數量詞並不會清除群組定義。

如果群組沒有擷取任何子字串,那個群組的反向參考是未定義的,並且從來不會進行比對。例如,運算式 \1() 從不比對任何項目,但是運算式 ()\1 則會比對空字串。

請參閱

其他資源

.NET Framework 規則運算式