快速入門
教學
工具和語言
範例
參考
書籍評論
替換文字教學
簡介
字元
不可列印字元
配對文字
反向參照
配對內容
大小寫轉換
條件式
本網站的更多資訊
簡介
正規表示式快速入門
正規表示式教學
替換字串教學
應用程式和語言
正規表示式範例
正規表示式參考
替換字串參考
書籍評論
可列印 PDF
關於本網站
RSS Feed 和部落格

編號反向參照

如果您的正規表示式有 命名編號擷取群組,您可以在替換文字中重新插入由任何一個擷取群組配對的文字。您的替換文字可以參照任意數量的群組,甚至可以多次參照同一個群組。這使得可以以許多不同的方式重新排列由正規表示式配對的文字。舉一個簡單的範例,正規表示式 \*(\w+)\* 會配對星號之間的單一字詞,將字詞儲存在第一個 (也是唯一一個) 擷取群組中。替換文字 <b>\1</b> 會用擷取群組儲存的文字,以粗體標籤替換每個正規表示式配對。實際上,這個搜尋和替換會用粗體標籤替換星號,讓星號之間的字詞保持原樣。使用反向參照的這個技巧很重要。將 *word* 整體替換為 <b>word</b> 比想辦法正確地個別替換星號容易且有效率得多。

替換文字中反向引用的 \1 語法取自 正規表示式中反向引用的語法\1\9JGsoft 應用程式DelphiPerl(儘管已棄用)、PythonRubyPHPRBoostTcl 支援。雙位數反向引用 \10\99 受 JGsoft 應用程式、Delphi、Python 和 Boost 支援。如果正規表示式中沒有足夠的擷取群組,讓雙位數反向引用有效,那麼所有這些版本都會將 \10\99 視為單一位數反向引用,後接一個字面數字。支援單一位數反向引用但非雙位數反向引用的版本也會這樣做。

$1$99(用於單一位數和雙位數反向引用)受 JGsoft 應用程式Delphi.NETJavaJavaScriptVBScriptPCRE2PHPBooststd::regexXPath 支援。這些也是在 Perl 中儲存由擷取群組配對到的文字的變數。如果正規表示式中沒有足夠的擷取群組,讓雙位數反向引用有效,那麼 $10$99 會被這些版本(.NET、Perl、PCRE2 和 std::regex 除外)視為單一位數反向引用,後接一個字面數字。

在數字周圍加上大括號 ${1} 會將數字與任何後接的字面數字隔離。這在 JGsoft 應用程式、Delphi、.NET、Perl、PCRE2、PHP、Boost 和 XRegExp 中有效。

命名反向引用

如果你的正規表示式有 命名擷取群組,那麼你應該在取代文字中使用它們的命名反向參照。正規表示式 (?'name'group) 有個名為「name」的群組。你可以在 JGsoft 應用程式Delphi.NETPCRE2Java 7XRegExp 中使用 ${name} 來參照這個群組。PCRE2 也支援沒有大括弧的 $name。在 Perl 5.10 和更新版本中,你可以內插變數 $+{name}Boost 也在取代字串中使用 $+{name}${name} 在任何版本的 Perl 中都不會運作。$name 是 PCRE2 獨有的。

在 Python 中,如果你有正規表示式 (?P<name>group),那麼你可以使用 \g<name> 在取代文字中使用它的比對。這個語法也在 JGsoft 應用程式和 Delphi 中運作。Python 和 JGsoft 應用程式(但 Delphi 沒有)也支援使用這個語法進行編號反向參照。在 Python 中,這是唯一可以讓編號反向參照緊接在字面數字之後的方法。

PHPR 在正規表示式中支援命名擷取群組和命名反向參照。但是它們不支援在取代文字中使用命名反向參照。你必須在取代文字中使用編號反向參照來重新插入由命名群組比對的文字。要找出這些數字,請從左到右計算正規表示式中所有擷取群組(命名和未命名)的左括弧。

對不存在擷取群組的反向參照

無效反向參照是指對大於正規表示式中擷取群組數量的數字,或對正規表示式中不存在的名稱的參照。這種反向參照可以用三種不同的方式處理。Delphi、Perl、Ruby、PHP、R、Boost、std::regex、XPath 和 Tcl 會用空字串取代無效反向參照。Java、XRegExp、PCRE2 和 Python 會將它們視為語法錯誤。JavaScript(沒有 XRegExp)和 .NET 將它們視為字面文字。

原始的 JGsoft 風格 會用空字串取代無效反向參照。但是 JGsoft V2 會將它們視為語法錯誤。使用 V2 風格的所有應用程式都會對取代字串套用語法著色,並以紅色突顯無效反向參照。

對非參與擷取群組的反向參照

非參與擷取群組是完全未參與比對嘗試的群組。這與比對空字串的群組不同。a(b?)c 中的群組總是參與比對。其內容是選用的,但群組本身不是選用的。a(b)?c 中的群組是選用的。當正規表示式比對 abc 時,它會參與,但當正規表示式比對 ac 時,它不會參與。

在大部分應用程式中,替換字串中對比對空字串的群組或未參與的群組的回朔參考之間沒有差異。兩者都會替換為空字串。兩個例外是 PythonPCRE2。它們允許替換字串中對選用擷取群組的回朔參考。但如果擷取群組碰巧未參與其中一個正規表示式比對,搜尋和取代會在 PCRE2 中傳回錯誤碼。在 Python 3.4 及之前版本中,相同的情況會引發例外。Python 3.5 不再引發例外。

對編號最高的群組的回朔參考

JGsoft 應用程式Delphi 中,$+ 會插入實際參與比對的編號最高的群組比對到的文字。在 Perl 5.18 中,變數 $+ 包含相同的文字。當 (a)(b)|(c)(d) 比對 ab 時,$+ 會替換為 b。當相同的正規表示式比對 cd 時,$+ 會插入 d\+ 在 JGsoft 應用程式、Delphi 和 Ruby 中執行相同的動作。

.NETVBScriptBoost 中,$+ 會插入編號最高的群組比對到的文字,不論它是否參與比對。如果它沒有參與,則不會插入任何東西。在 Perl 5.16 及之前版本中,變數 $+ 包含相同的文字。當 (a)(b)|(c)(d) 比對 ab 時,$+ 會替換為空字串。當相同的正規表示式比對 cd 時,$+ 會插入 d

Boost 1.42 新增了它自己發明的其他語法,用於編號最高的群組的任何意義。$^N$LAST_SUBMATCH_RESULT${^LAST_SUBMATCH_RESULT} 都會插入實際參與比對的編號最高的群組比對到的文字。$LAST_PAREN_MATCH${^LAST_PAREN_MATCH} 都會插入編號最高的群組比對到的文字,不論它是否參與比對。

| 快速入門 | 教學 | 工具和語言 | 範例 | 參考 | 書籍評論 |

| 簡介 | 字元 | 非列印字元 | 配對文字 | 反向參照 | 配對內容 | 大小寫轉換 | 條件式 |