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

替換字串條件

替換字串條件讓您可以在特定擷取群組參與配對時使用一個替換,而在該擷取群組未參與配對時使用另一個替換。此功能受JGsoft V2、Boost 和 PCRE2 支援。Boost 和 PCRE2 各自發明了自己的語法。JGsoft V2 支援這兩種語法。

若要在 Boost 中使用條件,您需要將 regex_constants::format_all 傳遞至 regex_replace。若要在 PCRE2 中使用條件,您需要將 PCRE2_SUBSTITUTE_EXTENDED 傳遞至 pcre2_substitute

Boost 替換字串條件

Boost 的語法是 (?1匹配:不匹配),其中 1 是 1 到 99 之間的數字,用於參照編號的擷取群組。匹配 用於替換擷取群組參與其中的匹配項。不匹配 用於群組未參與其中的匹配項。冒號 : 區分這兩個部分。如果您想要在 匹配 部分中使用文字冒號,則需要使用反斜線對其進行跳脫。如果您想要在條件式中的任何位置使用文字右括號,則也需要使用反斜線對其進行跳脫。

括號將條件式與替換字串的其餘部分分隔開來。開始(?1匹配:不匹配)結束 在群組參與時替換為 開始匹配結束,在群組未參與時替換為 開始不匹配結束。JGsoft V2 需要括號。如果替換中的條件式後面沒有任何內容,Boost 允許您省略括號。因此,?1匹配:不匹配(?1匹配:不匹配) 相同。

配對和未配對的部分可以是空白。如果未配對的部分是空白,則可以省略冒號。因此,當群組參與時,matched:matched 會取代為 matched。當群組未參與時,它們會將配對內容替換為空白。

您可以在 matchedunmatched 中使用完整的替換字串語法。這表示您可以在其他條件式內嵌套條件式。因此,當兩個群組都參與時,(?1one(?2two):(?2two:none)) 會取代為 onetwo;當群組 1 或 2 參與而另一個未參與時,會取代為 onetwo;當兩個群組都未參與時,會取代為 none。使用 Boost ?1one(?2two):?2two:none 會執行完全相同的動作,但會省略不必要的括號。

JGsoft V2 正規表示式風格將參照不存在的擷取群組的條件式視為錯誤。如果問號後有兩個數字,但沒有足夠的擷取群組讓兩個數字的條件式有效,則僅會使用第一個數字作為條件式,而第二個數字會是文字。因此,當正規表示式中少於 12 個擷取群組時,(?12matched) 會在擷取群組 1 參與配對時取代為 2matched

Boost 將參照不存在的群組編號的條件式視為對從未參與配對的群組的條件式。因此,當正規表示式中少於 12 個擷取群組時,(?12twelve:not twelve) 會永遠取代為 not twelve

您可以透過在數字周圍加上大括號來避免單數位元和雙數位元條件式之間的歧義。(?{1}1:0) 在群組 1 參與時取代為 1,在群組 1 未參與時取代為 0,即使正規表示式中有 11 個以上的擷取群組也是如此。(?{12}twelve:not twelve) 永遠是參考群組 12 的條件式,即使正規表示式中少於 12 個群組(這可能會使條件式無效)。

使用大括號的語法也允許您透過名稱來參考命名擷取群組(?{name}matched:unmatched) 在群組「name」參與比對時取代為 matched,在群組「name」未參與比對時取代為 unmatched。如果群組不存在,JGsoft V2 正規表示式風格會將條件式視為錯誤。不過,Boost 會將參考不存在群組名稱的條件式視為文字。因此,(?{nonexisting}matched:unmatched) 使用 ?{nonexisting}matched:unmatched 作為文字替換。

PCRE2 替換字串條件式

PCRE2 的語法為 ${1:+matched:unmatched},其中 1 是介於 1 到 99 之間的數字,用來參考編號的擷取群組。如果您的正規表示式包含命名擷取群組,則您可以透過名稱在條件式中參考它們:${name:+matched:unmatched}

matched 用於替換擷取群組參與的比對。unmatched 用於擷取群組未參與的比對。:+ 將群組編號或名稱與條件式的第一部分分隔開來。第二個冒號分隔兩個部分。如果您要在 matched 部分中使用文字冒號,則需要使用反斜線對其進行跳脫。如果您要在條件式的任何位置使用文字閉合大括號,則也需要使用反斜線對其進行跳脫。除了用於開始條件式的 :+ 之外,加號沒有任何特殊意義,因此不需要對其進行跳脫。

您可以在 matchedunmatched 中使用完整的替換字串語法。這表示您可以在其他條件式內嵌套條件式。因此 ${1:+one${2:+two}:${2:+two:none}} 會在兩個群組都參與時替換為 onetwo,在群組 1 或 2 參與而另一個沒有參與時替換為 onetwo,在兩個群組都沒有參與時替換為 none

${1:-unmatched}${name:-unmatched}${1:+${1}:unmatched}${name:+${name}:unmatched} 的簡寫。如果群組參與比對,它們會插入群組擷取的文字。如果群組沒有參與,它們會插入 unmatched。使用這個語法時,:- 會將群組編號或名稱與條件式的內容區隔開來。條件式只有一個部分,其中冒號和減號沒有特殊意義。

PCRE2 和 JGsoft V2 都會將參照不存在擷取群組的條件式視為錯誤。

跳脫問號、冒號、括號和大括號

如上所述,您需要使用反斜線跳脫您想要在條件式的 matched 部分中當作字面值使用的冒號。您還需要使用反斜線跳脫條件式內的字面值右括號 (Boost) 或大括號 (PCRE2)。

在支援條件式的替換字串風格中,您可以使用反斜線跳脫冒號、括號、大括號,甚至問號,以確保它們在替換字串中的任何位置都被解釋為字面值。但通常不需要這樣做。

冒號在 unmatched 部分或條件式外部沒有任何特殊意義。因此您不需要在那裡跳脫它。如果問號後面沒有數字或大括號,它沒有任何特殊意義。在 PCRE2 中,它永遠沒有特殊意義。因此您只需要在您想要在 Boost 或 JGsoftV2 中使用字面值問號後接字面值數字或大括號作為替換時,才需要使用反斜線跳脫問號。

在 JGsoft V2 風味中,開啟括號是條件語法的部分。第一個未跳脫的關閉括號會結束條件。所有其他未跳脫的開啟和關閉括號都是字面。

Boost 總是使用括號進行分組。未跳脫的開啟括號總是開啟一個群組。群組可以巢狀。未跳脫的關閉括號總是關閉一個群組。未跳脫的關閉括號如果沒有匹配的開啟括號,實際上會截斷替換字串。因此 Boost 要求您始終使用反斜線跳脫字面括號。

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

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